using System; using System.Threading; namespace ETModel { public partial struct ETTask { private static readonly ETTask CanceledUniTask = new Func(() => { var promise = new ETTaskCompletionSource(); promise.TrySetCanceled(); return new ETTask(promise); })(); public static ETTask CompletedTask => new ETTask(); public static ETTask FromException(Exception ex) { var promise = new ETTaskCompletionSource(); promise.TrySetException(ex); return new ETTask(promise); } public static ETTask FromException(Exception ex) { var promise = new ETTaskCompletionSource(); promise.TrySetException(ex); return new ETTask(promise); } public static ETTask FromResult(T value) { return new ETTask(value); } public static ETTask FromCanceled() { return CanceledUniTask; } public static ETTask FromCanceled() { return CanceledUniTaskCache.Task; } public static ETTask FromCanceled(CancellationToken token) { var promise = new ETTaskCompletionSource(); promise.TrySetException(new OperationCanceledException(token)); return new ETTask(promise); } public static ETTask FromCanceled(CancellationToken token) { var promise = new ETTaskCompletionSource(); promise.TrySetException(new OperationCanceledException(token)); return new ETTask(promise); } /// shorthand of new UniTask[T](Func[UniTask[T]] factory) public static ETTask Lazy(Func> factory) { return new ETTask(factory); } private static class CanceledUniTaskCache { public static readonly ETTask Task; static CanceledUniTaskCache() { var promise = new ETTaskCompletionSource(); promise.TrySetCanceled(); Task = new ETTask(promise); } } } internal static class CompletedTasks { public static readonly ETTask True = ETTask.FromResult(true); public static readonly ETTask False = ETTask.FromResult(false); public static readonly ETTask Zero = ETTask.FromResult(0); public static readonly ETTask MinusOne = ETTask.FromResult(-1); public static readonly ETTask One = ETTask.FromResult(1); } }