using System; using System.Threading; namespace ET { public partial struct ETTask { public static ETTask CompletedTask => new ETTask(); public static ETTask FromException(Exception ex) { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); tcs.TrySetException(ex); return tcs.Task; } public static ETTask FromException(Exception ex) { var tcs = new ETTaskCompletionSource(); tcs.TrySetException(ex); return tcs.Task; } public static ETTask FromResult(T value) { return new ETTask(value); } public static ETTask FromCanceled() { return CanceledETTaskCache.Task; } public static ETTask FromCanceled() { return CanceledETTaskCache.Task; } public static ETTask FromCanceled(CancellationToken token) { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); tcs.TrySetException(new OperationCanceledException(token)); return tcs.Task; } public static ETTask FromCanceled(CancellationToken token) { var tcs = new ETTaskCompletionSource(); tcs.TrySetException(new OperationCanceledException(token)); return tcs.Task; } private static class CanceledETTaskCache { public static readonly ETTask Task; static CanceledETTaskCache() { ETTaskCompletionSource tcs = new ETTaskCompletionSource(); tcs.TrySetCanceled(); Task = tcs.Task; } } private static class CanceledETTaskCache { public static readonly ETTask Task; static CanceledETTaskCache() { var taskCompletionSource = new ETTaskCompletionSource(); taskCompletionSource.TrySetCanceled(); Task = taskCompletionSource.Task; } } } 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); } }