using System.Threading.Tasks; using static Engine.Core.WaitForTaskYield; namespace Engine.Core; public class WaitForTaskYield(Task task, TaskCompletionStatus completionStatus = TaskCompletionStatus.Any) : ICoroutineYield { public bool Yield() { switch (completionStatus) { case TaskCompletionStatus.Success: if (task.IsCanceled) throw new("Task has been canceled."); if (task.IsFaulted) throw task.Exception ?? new("Task has faulted."); return !task.IsCompletedSuccessfully; case TaskCompletionStatus.Fail: if (task.IsCompletedSuccessfully) throw new("Task was completed successfully."); return !task.IsFaulted; } return !task.IsCompleted; } public enum TaskCompletionStatus { Any, Success, Fail } }