#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member 
 | 
  
 | 
using Cysharp.Threading.Tasks.Internal; 
 | 
using System; 
 | 
using System.Runtime.CompilerServices; 
 | 
using System.Runtime.ExceptionServices; 
 | 
using System.Threading; 
 | 
  
 | 
namespace Cysharp.Threading.Tasks 
 | 
{ 
 | 
    public partial struct UniTask 
 | 
    { 
 | 
        static readonly UniTask CanceledUniTask = new Func<UniTask>(() => 
 | 
        { 
 | 
            return new UniTask(new CanceledResultSource(CancellationToken.None), 0); 
 | 
        })(); 
 | 
  
 | 
        static class CanceledUniTaskCache<T> 
 | 
        { 
 | 
            public static readonly UniTask<T> Task; 
 | 
  
 | 
            static CanceledUniTaskCache() 
 | 
            { 
 | 
                Task = new UniTask<T>(new CanceledResultSource<T>(CancellationToken.None), 0); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public static readonly UniTask CompletedTask = new UniTask(); 
 | 
  
 | 
        public static UniTask FromException(Exception ex) 
 | 
        { 
 | 
            if (ex is OperationCanceledException oce) 
 | 
            { 
 | 
                return FromCanceled(oce.CancellationToken); 
 | 
            } 
 | 
  
 | 
            return new UniTask(new ExceptionResultSource(ex), 0); 
 | 
        } 
 | 
  
 | 
        public static UniTask<T> FromException<T>(Exception ex) 
 | 
        { 
 | 
            if (ex is OperationCanceledException oce) 
 | 
            { 
 | 
                return FromCanceled<T>(oce.CancellationToken); 
 | 
            } 
 | 
  
 | 
            return new UniTask<T>(new ExceptionResultSource<T>(ex), 0); 
 | 
        } 
 | 
  
 | 
        public static UniTask<T> FromResult<T>(T value) 
 | 
        { 
 | 
            return new UniTask<T>(value); 
 | 
        } 
 | 
  
 | 
        public static UniTask FromCanceled(CancellationToken cancellationToken = default) 
 | 
        { 
 | 
            if (cancellationToken == CancellationToken.None) 
 | 
            { 
 | 
                return CanceledUniTask; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                return new UniTask(new CanceledResultSource(cancellationToken), 0); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public static UniTask<T> FromCanceled<T>(CancellationToken cancellationToken = default) 
 | 
        { 
 | 
            if (cancellationToken == CancellationToken.None) 
 | 
            { 
 | 
                return CanceledUniTaskCache<T>.Task; 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                return new UniTask<T>(new CanceledResultSource<T>(cancellationToken), 0); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        public static UniTask Create(Func<UniTask> factory) 
 | 
        { 
 | 
            return factory(); 
 | 
        } 
 | 
  
 | 
        public static UniTask Create(Func<CancellationToken, UniTask> factory, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return factory(cancellationToken); 
 | 
        } 
 | 
  
 | 
        public static UniTask Create<T>(T state, Func<T, UniTask> factory) 
 | 
        { 
 | 
            return factory(state); 
 | 
        } 
 | 
  
 | 
        public static UniTask<T> Create<T>(Func<UniTask<T>> factory) 
 | 
        { 
 | 
            return factory(); 
 | 
        } 
 | 
  
 | 
        public static AsyncLazy Lazy(Func<UniTask> factory) 
 | 
        { 
 | 
            return new AsyncLazy(factory); 
 | 
        } 
 | 
  
 | 
        public static AsyncLazy<T> Lazy<T>(Func<UniTask<T>> factory) 
 | 
        { 
 | 
            return new AsyncLazy<T>(factory); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of fire and forget void action. 
 | 
        /// </summary> 
 | 
        public static void Void(Func<UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            asyncAction().Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of fire and forget void action. 
 | 
        /// </summary> 
 | 
        public static void Void(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            asyncAction(cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of fire and forget void action. 
 | 
        /// </summary> 
 | 
        public static void Void<T>(Func<T, UniTaskVoid> asyncAction, T state) 
 | 
        { 
 | 
            asyncAction(state).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of create add UniTaskVoid to delegate. 
 | 
        /// For example: FooAction = UniTask.Action(async () => { /* */ }) 
 | 
        /// </summary> 
 | 
        public static Action Action(Func<UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return () => asyncAction().Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of create add UniTaskVoid to delegate. 
 | 
        /// </summary> 
 | 
        public static Action Action(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return () => asyncAction(cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// helper of create add UniTaskVoid to delegate. 
 | 
        /// </summary> 
 | 
        public static Action Action<T>(T state, Func<T, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return () => asyncAction(state).Forget(); 
 | 
        } 
 | 
  
 | 
#if UNITY_2018_3_OR_NEWER 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async () => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction UnityAction(Func<UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return () => asyncAction().Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, this.GetCancellationTokenOnDestroy())) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction UnityAction(Func<CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return () => asyncAction(cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(FooAsync, Argument)) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction UnityAction<T>(T state, Func<T, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return () => asyncAction(state).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T> UnityAction<T>(Func<T, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return (arg) => asyncAction(arg).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1> UnityAction<T0, T1>(Func<T0, T1, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return (arg0, arg1) => asyncAction(arg0, arg1).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1, T2> UnityAction<T0, T1, T2>(Func<T0, T1, T2, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return (arg0, arg1, arg2) => asyncAction(arg0, arg1, arg2).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1, T2, T3> UnityAction<T0, T1, T2, T3>(Func<T0, T1, T2, T3, UniTaskVoid> asyncAction) 
 | 
        { 
 | 
            return (arg0, arg1, arg2, arg3) => asyncAction(arg0, arg1, arg2, arg3).Forget(); 
 | 
        } 
 | 
  
 | 
        // <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T arg, CancellationToken cancellationToken) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T> UnityAction<T>(Func<T, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return (arg) => asyncAction(arg, cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, CancellationToken cancellationToken) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1> UnityAction<T0, T1>(Func<T0, T1, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return (arg0, arg1) => asyncAction(arg0, arg1, cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, CancellationToken cancellationToken) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1, T2> UnityAction<T0, T1, T2>(Func<T0, T1, T2, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return (arg0, arg1, arg2) => asyncAction(arg0, arg1, arg2, cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Create async void(UniTaskVoid) UnityAction. 
 | 
        /// For example: onClick.AddListener(UniTask.UnityAction(async (T0 arg0, T1 arg1, T2 arg2, T3 arg3, CancellationToken cancellationToken) => { /* */ } )) 
 | 
        /// </summary> 
 | 
        public static UnityEngine.Events.UnityAction<T0, T1, T2, T3> UnityAction<T0, T1, T2, T3>(Func<T0, T1, T2, T3, CancellationToken, UniTaskVoid> asyncAction, CancellationToken cancellationToken) 
 | 
        { 
 | 
            return (arg0, arg1, arg2, arg3) => asyncAction(arg0, arg1, arg2, arg3, cancellationToken).Forget(); 
 | 
        } 
 | 
  
 | 
#endif 
 | 
  
 | 
        /// <summary> 
 | 
        /// Defer the task creation just before call await. 
 | 
        /// </summary> 
 | 
        public static UniTask Defer(Func<UniTask> factory) 
 | 
        { 
 | 
            return new UniTask(new DeferPromise(factory), 0); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Defer the task creation just before call await. 
 | 
        /// </summary> 
 | 
        public static UniTask<T> Defer<T>(Func<UniTask<T>> factory) 
 | 
        { 
 | 
            return new UniTask<T>(new DeferPromise<T>(factory), 0); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Defer the task creation just before call await. 
 | 
        /// </summary> 
 | 
        public static UniTask Defer<TState>(TState state, Func<TState, UniTask> factory) 
 | 
        { 
 | 
            return new UniTask(new DeferPromiseWithState<TState>(state, factory), 0); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Defer the task creation just before call await. 
 | 
        /// </summary> 
 | 
        public static UniTask<TResult> Defer<TState, TResult>(TState state, Func<TState, UniTask<TResult>> factory) 
 | 
        { 
 | 
            return new UniTask<TResult>(new DeferPromiseWithState<TState, TResult>(state, factory), 0); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Never complete. 
 | 
        /// </summary> 
 | 
        public static UniTask Never(CancellationToken cancellationToken) 
 | 
        { 
 | 
            return new UniTask<AsyncUnit>(new NeverPromise<AsyncUnit>(cancellationToken), 0); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// Never complete. 
 | 
        /// </summary> 
 | 
        public static UniTask<T> Never<T>(CancellationToken cancellationToken) 
 | 
        { 
 | 
            return new UniTask<T>(new NeverPromise<T>(cancellationToken), 0); 
 | 
        } 
 | 
  
 | 
        sealed class ExceptionResultSource : IUniTaskSource 
 | 
        { 
 | 
            readonly ExceptionDispatchInfo exception; 
 | 
            bool calledGet; 
 | 
  
 | 
            public ExceptionResultSource(Exception exception) 
 | 
            { 
 | 
                this.exception = ExceptionDispatchInfo.Capture(exception); 
 | 
            } 
 | 
  
 | 
            public void GetResult(short token) 
 | 
            { 
 | 
                if (!calledGet) 
 | 
                { 
 | 
                    calledGet = true; 
 | 
                    GC.SuppressFinalize(this); 
 | 
                } 
 | 
                exception.Throw(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                return UniTaskStatus.Faulted; 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return UniTaskStatus.Faulted; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                continuation(state); 
 | 
            } 
 | 
  
 | 
            ~ExceptionResultSource() 
 | 
            { 
 | 
                if (!calledGet) 
 | 
                { 
 | 
                    UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class ExceptionResultSource<T> : IUniTaskSource<T> 
 | 
        { 
 | 
            readonly ExceptionDispatchInfo exception; 
 | 
            bool calledGet; 
 | 
  
 | 
            public ExceptionResultSource(Exception exception) 
 | 
            { 
 | 
                this.exception = ExceptionDispatchInfo.Capture(exception); 
 | 
            } 
 | 
  
 | 
            public T GetResult(short token) 
 | 
            { 
 | 
                if (!calledGet) 
 | 
                { 
 | 
                    calledGet = true; 
 | 
                    GC.SuppressFinalize(this); 
 | 
                } 
 | 
                exception.Throw(); 
 | 
                return default; 
 | 
            } 
 | 
  
 | 
            void IUniTaskSource.GetResult(short token) 
 | 
            { 
 | 
                if (!calledGet) 
 | 
                { 
 | 
                    calledGet = true; 
 | 
                    GC.SuppressFinalize(this); 
 | 
                } 
 | 
                exception.Throw(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                return UniTaskStatus.Faulted; 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return UniTaskStatus.Faulted; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                continuation(state); 
 | 
            } 
 | 
  
 | 
            ~ExceptionResultSource() 
 | 
            { 
 | 
                if (!calledGet) 
 | 
                { 
 | 
                    UniTaskScheduler.PublishUnobservedTaskException(exception.SourceException); 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class CanceledResultSource : IUniTaskSource 
 | 
        { 
 | 
            readonly CancellationToken cancellationToken; 
 | 
  
 | 
            public CanceledResultSource(CancellationToken cancellationToken) 
 | 
            { 
 | 
                this.cancellationToken = cancellationToken; 
 | 
            } 
 | 
  
 | 
            public void GetResult(short token) 
 | 
            { 
 | 
                throw new OperationCanceledException(cancellationToken); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                return UniTaskStatus.Canceled; 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return UniTaskStatus.Canceled; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                continuation(state); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class CanceledResultSource<T> : IUniTaskSource<T> 
 | 
        { 
 | 
            readonly CancellationToken cancellationToken; 
 | 
  
 | 
            public CanceledResultSource(CancellationToken cancellationToken) 
 | 
            { 
 | 
                this.cancellationToken = cancellationToken; 
 | 
            } 
 | 
  
 | 
            public T GetResult(short token) 
 | 
            { 
 | 
                throw new OperationCanceledException(cancellationToken); 
 | 
            } 
 | 
  
 | 
            void IUniTaskSource.GetResult(short token) 
 | 
            { 
 | 
                throw new OperationCanceledException(cancellationToken); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                return UniTaskStatus.Canceled; 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return UniTaskStatus.Canceled; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                continuation(state); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class DeferPromise : IUniTaskSource 
 | 
        { 
 | 
            Func<UniTask> factory; 
 | 
            UniTask task; 
 | 
            UniTask.Awaiter awaiter; 
 | 
  
 | 
            public DeferPromise(Func<UniTask> factory) 
 | 
            { 
 | 
                this.factory = factory; 
 | 
            } 
 | 
  
 | 
            public void GetResult(short token) 
 | 
            { 
 | 
                awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                var f = Interlocked.Exchange(ref factory, null); 
 | 
                if (f != null) 
 | 
                { 
 | 
                    task = f(); 
 | 
                    awaiter = task.GetAwaiter(); 
 | 
                } 
 | 
  
 | 
                return task.Status; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                awaiter.SourceOnCompleted(continuation, state); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return task.Status; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class DeferPromise<T> : IUniTaskSource<T> 
 | 
        { 
 | 
            Func<UniTask<T>> factory; 
 | 
            UniTask<T> task; 
 | 
            UniTask<T>.Awaiter awaiter; 
 | 
  
 | 
            public DeferPromise(Func<UniTask<T>> factory) 
 | 
            { 
 | 
                this.factory = factory; 
 | 
            } 
 | 
  
 | 
            public T GetResult(short token) 
 | 
            { 
 | 
                return awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            void IUniTaskSource.GetResult(short token) 
 | 
            { 
 | 
                awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                var f = Interlocked.Exchange(ref factory, null); 
 | 
                if (f != null) 
 | 
                { 
 | 
                    task = f(); 
 | 
                    awaiter = task.GetAwaiter(); 
 | 
                } 
 | 
  
 | 
                return task.Status; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                awaiter.SourceOnCompleted(continuation, state); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return task.Status; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class DeferPromiseWithState<TState> : IUniTaskSource 
 | 
        { 
 | 
            Func<TState, UniTask> factory; 
 | 
            TState argument; 
 | 
            UniTask task; 
 | 
            UniTask.Awaiter awaiter; 
 | 
  
 | 
            public DeferPromiseWithState(TState argument, Func<TState, UniTask> factory) 
 | 
            { 
 | 
                this.argument = argument; 
 | 
                this.factory = factory; 
 | 
            } 
 | 
  
 | 
            public void GetResult(short token) 
 | 
            { 
 | 
                awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                var f = Interlocked.Exchange(ref factory, null); 
 | 
                if (f != null) 
 | 
                { 
 | 
                    task = f(argument); 
 | 
                    awaiter = task.GetAwaiter(); 
 | 
                } 
 | 
  
 | 
                return task.Status; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                awaiter.SourceOnCompleted(continuation, state); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return task.Status; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class DeferPromiseWithState<TState, TResult> : IUniTaskSource<TResult> 
 | 
        { 
 | 
            Func<TState, UniTask<TResult>> factory; 
 | 
            TState argument; 
 | 
            UniTask<TResult> task; 
 | 
            UniTask<TResult>.Awaiter awaiter; 
 | 
  
 | 
            public DeferPromiseWithState(TState argument, Func<TState, UniTask<TResult>> factory) 
 | 
            { 
 | 
                this.argument = argument; 
 | 
                this.factory = factory; 
 | 
            } 
 | 
  
 | 
            public TResult GetResult(short token) 
 | 
            { 
 | 
                return awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            void IUniTaskSource.GetResult(short token) 
 | 
            { 
 | 
                awaiter.GetResult(); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                var f = Interlocked.Exchange(ref factory, null); 
 | 
                if (f != null) 
 | 
                { 
 | 
                    task = f(argument); 
 | 
                    awaiter = task.GetAwaiter(); 
 | 
                } 
 | 
  
 | 
                return task.Status; 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                awaiter.SourceOnCompleted(continuation, state); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return task.Status; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        sealed class NeverPromise<T> : IUniTaskSource<T> 
 | 
        { 
 | 
            static readonly Action<object> cancellationCallback = CancellationCallback; 
 | 
  
 | 
            CancellationToken cancellationToken; 
 | 
            UniTaskCompletionSourceCore<T> core; 
 | 
  
 | 
            public NeverPromise(CancellationToken cancellationToken) 
 | 
            { 
 | 
                this.cancellationToken = cancellationToken; 
 | 
                if (this.cancellationToken.CanBeCanceled) 
 | 
                { 
 | 
                    this.cancellationToken.RegisterWithoutCaptureExecutionContext(cancellationCallback, this); 
 | 
                } 
 | 
            } 
 | 
  
 | 
            static void CancellationCallback(object state) 
 | 
            { 
 | 
                var self = (NeverPromise<T>)state; 
 | 
                self.core.TrySetCanceled(self.cancellationToken); 
 | 
            } 
 | 
  
 | 
            public T GetResult(short token) 
 | 
            { 
 | 
                return core.GetResult(token); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus GetStatus(short token) 
 | 
            { 
 | 
                return core.GetStatus(token); 
 | 
            } 
 | 
  
 | 
            public UniTaskStatus UnsafeGetStatus() 
 | 
            { 
 | 
                return core.UnsafeGetStatus(); 
 | 
            } 
 | 
  
 | 
            public void OnCompleted(Action<object> continuation, object state, short token) 
 | 
            { 
 | 
                core.OnCompleted(continuation, state, token); 
 | 
            } 
 | 
  
 | 
            void IUniTaskSource.GetResult(short token) 
 | 
            { 
 | 
                core.GetResult(token); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
  
 | 
    internal static class CompletedTasks 
 | 
    { 
 | 
        public static readonly UniTask<AsyncUnit> AsyncUnit = UniTask.FromResult(Cysharp.Threading.Tasks.AsyncUnit.Default); 
 | 
        public static readonly UniTask<bool> True = UniTask.FromResult(true); 
 | 
        public static readonly UniTask<bool> False = UniTask.FromResult(false); 
 | 
        public static readonly UniTask<int> Zero = UniTask.FromResult(0); 
 | 
        public static readonly UniTask<int> MinusOne = UniTask.FromResult(-1); 
 | 
        public static readonly UniTask<int> One = UniTask.FromResult(1); 
 | 
    } 
 | 
} 
 |