using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Aitex.Core.Utilities
{
    /// 
    /// 用于简化多次尝试执行动作,仅判断一次成功或者错误。类似于Trigger,但是增加了上升沿,下降沿两种逻辑
    /// 
    public class Retry
    {
        /// 
        /// 第一次触发成功
        /// 
        public bool IsSucceeded { get; set; }
        /// 
        /// 第一次触发失败
        /// 
        public bool IsErrored { get; set; }
        bool _result = false;
        int _retryTime = -1;
        /// 
        /// 当前执行结果
        /// 
        public bool Result
        {
            set
            {
                if (value)
                {
                    IsSucceeded = !_result;
                    IsErrored = false;
                }
                else
                {
                    IsErrored = (_result || _retryTime == -1);
                    IsSucceeded = false;
                }
                _result = value;
                _retryTime = ++_retryTime % 100;
            }
            get
            {
                return _result;
            }
        }
        public Retry()
        {
        }
        public void Do(Func function, int time)
        {
            for (int i = 0; i < time; i++)
            {
                if (function())
                    Result = true;
                Thread.Sleep(10);
            }
            Result = false;
        }
    }
}