diff --git a/Engine.Core/Systems/Yields/WaitForTaskYield.cs b/Engine.Core/Systems/Yields/WaitForTaskYield.cs new file mode 100644 index 0000000..bc39cba --- /dev/null +++ b/Engine.Core/Systems/Yields/WaitForTaskYield.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; + +using static Engine.Core.WaitForTaskYield; + +namespace Engine.Core; + +public class WaitForTaskYield(Task task, TaskCompletionStatus completionStatus = TaskCompletionStatus.Either) : ICoroutineYield +{ + public bool Yield() + { + switch (completionStatus) + { + case TaskCompletionStatus.Successful: + if (task.IsCanceled) + throw new("Task has been canceled."); + if (task.IsFaulted) + throw new("Task has faulted."); + return task.IsCompletedSuccessfully; + + case TaskCompletionStatus.Failed: + if (task.IsCompletedSuccessfully) + throw new("Task was completed successfully."); + return task.IsFaulted; + } + + return task.IsCompleted; + } + + public enum TaskCompletionStatus + { + Either, + Successful, + Failed + } +}