#if CSHARP_7_OR_LATER || (UNITY_2018_3_OR_NEWER && (NET_STANDARD_2_0 || NET_4_6)) #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member using System; using System.Threading; using UnityEngine.Events; namespace UniRx.Async { public partial struct UniTask { static readonly UniTask CanceledUniTask = new Func(() => { var promise = new UniTaskCompletionSource(); promise.SetCanceled(CancellationToken.None); promise.MarkHandled(); return promise.Task; })(); static class CanceledUniTaskCache { public static readonly UniTask Task; static CanceledUniTaskCache() { var promise = new UniTaskCompletionSource(); promise.SetCanceled(CancellationToken.None); promise.MarkHandled(); Task = promise.Task; } } public static readonly UniTask CompletedTask = new UniTask(); public static UniTask FromException(Exception ex) { var promise = new UniTaskCompletionSource(); promise.SetException(ex); promise.MarkHandled(); return promise.Task; } public static UniTask FromException(Exception ex) { var promise = new UniTaskCompletionSource(); promise.SetException(ex); promise.MarkHandled(); return promise.Task; } public static UniTask FromResult(T value) { return new UniTask(value); } public static UniTask FromCanceled(CancellationToken cancellationToken = default) { if (cancellationToken == CancellationToken.None) { return CanceledUniTask; } else { var promise = new UniTaskCompletionSource(); promise.SetCanceled(cancellationToken); promise.MarkHandled(); return promise.Task; } } public static UniTask FromCanceled(CancellationToken cancellationToken = default) { if (cancellationToken == CancellationToken.None) { return CanceledUniTaskCache.Task; } else { var promise = new UniTaskCompletionSource(); promise.SetCanceled(cancellationToken); promise.MarkHandled(); return promise.Task; } } // TODO:... /// shorthand of new UniTask[T](Func[UniTask[T]] factory) public static UniTask Lazy(Func> factory) { return new UniTask(factory); } /// /// helper of create add UniTaskVoid to delegate. /// For example: FooEvent += () => UniTask.Void(async () => { /* */ }) /// public static void Void(Func asyncAction) { asyncAction().Forget(); } public static Action VoidAction(Func asyncAction) { return () => Void(asyncAction); } public static UnityAction VoidUnityAction(Func asyncAction) { return () => Void(asyncAction); } /// /// helper of create add UniTaskVoid to delegate. /// For example: FooEvent += (sender, e) => UniTask.Void(async arg => { /* */ }, (sender, e)) /// public static void Void(Func asyncAction, T state) { asyncAction(state).Forget(); } } internal static class CompletedTasks { public static readonly UniTask Completed = new UniTask(); public static readonly UniTask AsyncUnit = UniTask.FromResult(UniRx.Async.AsyncUnit.Default); public static readonly UniTask True = UniTask.FromResult(true); public static readonly UniTask False = UniTask.FromResult(false); public static readonly UniTask Zero = UniTask.FromResult(0); public static readonly UniTask MinusOne = UniTask.FromResult(-1); public static readonly UniTask One = UniTask.FromResult(1); } } #endif