#pragma warning disable CS1591
using System;
using System.Runtime.CompilerServices;
namespace Cysharp.Threading.Tasks
{
    public enum UniTaskStatus
    {
        /// The operation has not yet completed. 
        Pending = 0,
        /// The operation completed successfully. 
        Succeeded = 1,
        /// The operation completed with an error. 
        Faulted = 2,
        /// The operation completed due to cancellation. 
        Canceled = 3
    }
    // similar as IValueTaskSource
    public interface IUniTaskSource
#if !UNITY_2018_3_OR_NEWER && !NETSTANDARD2_0
        : System.Threading.Tasks.Sources.IValueTaskSource
#pragma warning disable CS0108
#endif
    {
        UniTaskStatus GetStatus(short token);
        void OnCompleted(Action continuation, object state, short token);
        void GetResult(short token);
        UniTaskStatus UnsafeGetStatus(); // only for debug use.
#if !UNITY_2018_3_OR_NEWER && !NETSTANDARD2_0
#pragma warning restore CS0108
        System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token)
        {
            return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token);
        }
        void System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short token)
        {
            ((IUniTaskSource)this).GetResult(token);
        }
        void System.Threading.Tasks.Sources.IValueTaskSource.OnCompleted(Action continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags)
        {
            // ignore flags, always none.
            ((IUniTaskSource)this).OnCompleted(continuation, state, token);
        }
#endif
    }
    public interface IUniTaskSource : IUniTaskSource
#if !UNITY_2018_3_OR_NEWER && !NETSTANDARD2_0
        , System.Threading.Tasks.Sources.IValueTaskSource
#endif
    {
        new T GetResult(short token);
#if !UNITY_2018_3_OR_NEWER && !NETSTANDARD2_0
        new public UniTaskStatus GetStatus(short token)
        {
            return ((IUniTaskSource)this).GetStatus(token);
        }
        new public void OnCompleted(Action continuation, object state, short token)
        {
            ((IUniTaskSource)this).OnCompleted(continuation, state, token);
        }
        System.Threading.Tasks.Sources.ValueTaskSourceStatus System.Threading.Tasks.Sources.IValueTaskSource.GetStatus(short token)
        {
            return (System.Threading.Tasks.Sources.ValueTaskSourceStatus)(int)((IUniTaskSource)this).GetStatus(token);
        }
        T System.Threading.Tasks.Sources.IValueTaskSource.GetResult(short token)
        {
            return ((IUniTaskSource)this).GetResult(token);
        }
        void System.Threading.Tasks.Sources.IValueTaskSource.OnCompleted(Action continuation, object state, short token, System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags flags)
        {
            // ignore flags, always none.
            ((IUniTaskSource)this).OnCompleted(continuation, state, token);
        }
#endif
    }
    public static class UniTaskStatusExtensions
    {
        /// status != Pending. 
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static bool IsCompleted(this UniTaskStatus status)
        {
            return status != UniTaskStatus.Pending;
        }
        /// status == Succeeded. 
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static bool IsCompletedSuccessfully(this UniTaskStatus status)
        {
            return status == UniTaskStatus.Succeeded;
        }
        /// status == Canceled. 
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static bool IsCanceled(this UniTaskStatus status)
        {
            return status == UniTaskStatus.Canceled;
        }
        /// status == Faulted. 
        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public static bool IsFaulted(this UniTaskStatus status)
        {
            return status == UniTaskStatus.Faulted;
        }
    }
}