| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Runtime.CompilerServices;
- namespace ETModel
- {
- /// <summary>
- /// Lightweight unity specified task-like object.
- /// </summary>
- [AsyncMethodBuilder(typeof (ETAsyncTaskMethodBuilder))]
- public partial struct ETTask: IEquatable<ETTask>
- {
- private static readonly ETTask<AsyncUnit> DefaultAsyncUnitTask = new ETTask<AsyncUnit>(AsyncUnit.Default);
- private readonly IAwaiter awaiter;
- [DebuggerHidden]
- public ETTask(IAwaiter awaiter)
- {
- this.awaiter = awaiter;
- }
- [DebuggerHidden]
- public ETTask(Func<ETTask> factory)
- {
- this.awaiter = new LazyPromise(factory);
- }
- [DebuggerHidden]
- public AwaiterStatus Status => awaiter?.Status ?? AwaiterStatus.Succeeded;
- [DebuggerHidden]
- public bool IsCompleted => awaiter?.IsCompleted ?? true;
- [DebuggerHidden]
- public void GetResult()
- {
- if (awaiter != null)
- {
- awaiter.GetResult();
- }
- }
- [DebuggerHidden]
- public Awaiter GetAwaiter()
- {
- return new Awaiter(this);
- }
- /// <summary>
- /// returns (bool IsCanceled) instead of throws OperationCanceledException.
- /// </summary>
- public ETTask<bool> SuppressCancellationThrow()
- {
- AwaiterStatus status = Status;
- switch (status)
- {
- case AwaiterStatus.Succeeded:
- return CompletedTasks.False;
- case AwaiterStatus.Canceled:
- return CompletedTasks.True;
- default:
- return new ETTask<bool>(new IsCanceledAwaiter(this.awaiter));
- }
- }
- public bool Equals(ETTask other)
- {
- if (this.awaiter == null && other.awaiter == null)
- {
- return true;
- }
- if (this.awaiter != null && other.awaiter != null)
- {
- return this.awaiter == other.awaiter;
- }
- return false;
- }
- public override int GetHashCode()
- {
- if (this.awaiter == null)
- {
- return 0;
- }
- return this.awaiter.GetHashCode();
- }
- public override string ToString()
- {
- return this.awaiter == null? "()"
- : this.awaiter.Status == AwaiterStatus.Succeeded? "()"
- : "(" + this.awaiter.Status + ")";
- }
- public static implicit operator ETTask<AsyncUnit>(ETTask task)
- {
- if (task.awaiter == null)
- {
- return DefaultAsyncUnitTask;
- }
- if (task.awaiter.IsCompleted)
- {
- return DefaultAsyncUnitTask;
- }
- // UniTask<T> -> UniTask is free but UniTask -> UniTask<T> requires wrapping cost.
- return new ETTask<AsyncUnit>(new AsyncUnitAwaiter(task.awaiter));
- }
- private class AsyncUnitAwaiter: IAwaiter<AsyncUnit>
- {
- private readonly IAwaiter awaiter;
- public AsyncUnitAwaiter(IAwaiter awaiter)
- {
- this.awaiter = awaiter;
- }
- public bool IsCompleted => awaiter.IsCompleted;
- public AwaiterStatus Status => awaiter.Status;
- public AsyncUnit GetResult()
- {
- awaiter.GetResult();
- return AsyncUnit.Default;
- }
- public void OnCompleted(Action continuation)
- {
- awaiter.OnCompleted(continuation);
- }
- public void UnsafeOnCompleted(Action continuation)
- {
- awaiter.UnsafeOnCompleted(continuation);
- }
- void IAwaiter.GetResult()
- {
- awaiter.GetResult();
- }
- }
- private class IsCanceledAwaiter: IAwaiter<bool>
- {
- private readonly IAwaiter awaiter;
- public IsCanceledAwaiter(IAwaiter awaiter)
- {
- this.awaiter = awaiter;
- }
- public bool IsCompleted => awaiter.IsCompleted;
- public AwaiterStatus Status => awaiter.Status;
- public bool GetResult()
- {
- if (awaiter.Status == AwaiterStatus.Canceled)
- {
- return true;
- }
- awaiter.GetResult();
- return false;
- }
- public void OnCompleted(Action continuation)
- {
- awaiter.OnCompleted(continuation);
- }
- public void UnsafeOnCompleted(Action continuation)
- {
- awaiter.UnsafeOnCompleted(continuation);
- }
- void IAwaiter.GetResult()
- {
- awaiter.GetResult();
- }
- }
- public struct Awaiter: IAwaiter
- {
- private readonly ETTask task;
- [DebuggerHidden]
- public Awaiter(ETTask task)
- {
- this.task = task;
- }
- [DebuggerHidden]
- public bool IsCompleted => task.IsCompleted;
- [DebuggerHidden]
- public AwaiterStatus Status => task.Status;
- [DebuggerHidden]
- public void GetResult()
- {
- task.GetResult();
- }
- [DebuggerHidden]
- public void OnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.OnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- [DebuggerHidden]
- public void UnsafeOnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.UnsafeOnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- }
- }
- /// <summary>
- /// Lightweight unity specified task-like object.
- /// </summary>
- [AsyncMethodBuilder(typeof (AsyncUniTaskMethodBuilder<>))]
- public struct ETTask<T>: IEquatable<ETTask<T>>
- {
- private readonly T result;
- private readonly IAwaiter<T> awaiter;
- [DebuggerHidden]
- public ETTask(T result)
- {
- this.result = result;
- this.awaiter = null;
- }
- [DebuggerHidden]
- public ETTask(IAwaiter<T> awaiter)
- {
- this.result = default;
- this.awaiter = awaiter;
- }
- [DebuggerHidden]
- public ETTask(Func<ETTask<T>> factory)
- {
- this.result = default;
- this.awaiter = new LazyPromise<T>(factory);
- }
- [DebuggerHidden]
- public AwaiterStatus Status => awaiter?.Status ?? AwaiterStatus.Succeeded;
- [DebuggerHidden]
- public bool IsCompleted => awaiter?.IsCompleted ?? true;
- [DebuggerHidden]
- public T Result
- {
- get
- {
- if (awaiter == null)
- {
- return result;
- }
- return this.awaiter.GetResult();
- }
- }
- [DebuggerHidden]
- public Awaiter GetAwaiter()
- {
- return new Awaiter(this);
- }
- /// <summary>
- /// returns (bool IsCanceled, T Result) instead of throws OperationCanceledException.
- /// </summary>
- public ETTask<(bool IsCanceled, T Result)> SuppressCancellationThrow()
- {
- var status = Status;
- if (status == AwaiterStatus.Succeeded)
- {
- return new ETTask<(bool, T)>((false, Result));
- }
- if (status == AwaiterStatus.Canceled)
- {
- return new ETTask<(bool, T)>((true, default));
- }
- return new ETTask<(bool, T)>(new IsCanceledAwaiter(awaiter));
- }
- public bool Equals(ETTask<T> other)
- {
- if (this.awaiter == null && other.awaiter == null)
- {
- return EqualityComparer<T>.Default.Equals(this.result, other.result);
- }
- if (this.awaiter != null && other.awaiter != null)
- {
- return this.awaiter == other.awaiter;
- }
- return false;
- }
- public override int GetHashCode()
- {
- if (this.awaiter == null)
- {
- if (result == null)
- {
- return 0;
- }
- return result.GetHashCode();
- }
- return this.awaiter.GetHashCode();
- }
- public override string ToString()
- {
- return this.awaiter == null? result.ToString()
- : this.awaiter.Status == AwaiterStatus.Succeeded? this.awaiter.GetResult().ToString()
- : "(" + this.awaiter.Status + ")";
- }
- public static implicit operator ETTask(ETTask<T> task)
- {
- if (task.awaiter != null)
- {
- return new ETTask(task.awaiter);
- }
- return new ETTask();
- }
- private class IsCanceledAwaiter: IAwaiter<(bool, T)>
- {
- private readonly IAwaiter<T> awaiter;
- public IsCanceledAwaiter(IAwaiter<T> awaiter)
- {
- this.awaiter = awaiter;
- }
- public bool IsCompleted => awaiter.IsCompleted;
- public AwaiterStatus Status => awaiter.Status;
- public (bool, T) GetResult()
- {
- if (awaiter.Status == AwaiterStatus.Canceled)
- {
- return (true, default);
- }
- return (false, awaiter.GetResult());
- }
- public void OnCompleted(Action continuation)
- {
- awaiter.OnCompleted(continuation);
- }
- public void UnsafeOnCompleted(Action continuation)
- {
- awaiter.UnsafeOnCompleted(continuation);
- }
- void IAwaiter.GetResult()
- {
- awaiter.GetResult();
- }
- }
- public struct Awaiter: IAwaiter<T>
- {
- private readonly ETTask<T> task;
- [DebuggerHidden]
- public Awaiter(ETTask<T> task)
- {
- this.task = task;
- }
- [DebuggerHidden]
- public bool IsCompleted => task.IsCompleted;
- [DebuggerHidden]
- public AwaiterStatus Status => task.Status;
- [DebuggerHidden]
- void IAwaiter.GetResult()
- {
- GetResult();
- }
- [DebuggerHidden]
- public T GetResult()
- {
- return task.Result;
- }
- [DebuggerHidden]
- public void OnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.OnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- [DebuggerHidden]
- public void UnsafeOnCompleted(Action continuation)
- {
- if (task.awaiter != null)
- {
- task.awaiter.UnsafeOnCompleted(continuation);
- }
- else
- {
- continuation();
- }
- }
- }
- }
- }
|