using System;

namespace XGame.Framework.Asyncs
{
    public class Awaiter : IAwaiter
    {
        protected Action _continuation;

        public bool IsCompleted
        {
            get; protected set;
        }

        public void OnCompleted(Action continuation)
        {
            if (IsCompleted)
            {
                // 如果 await 开始时任务已经执行完成，则直接执行 await 后面的代码。
                // 注意，即便 _continuation 有值，也无需关心，因为报告结束的时候就会将其执行。
                continuation?.Invoke();
            }
            else
            {
                // 当使用多个 await 关键字等待此同一个 awaitable 实例时，此 OnCompleted 方法会被多次执行。
                // 当任务真正结束后，需要将这些所有的 await 后面的代码都执行。
                _continuation += continuation;
            }
        }

        public virtual void Completed(IAsync async)
        {
            if (IsCompleted) return;
            IsCompleted = true;
            _continuation?.Invoke();
        }

        //public void GetResult() { }
    }
}