using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Cysharp.Threading.Tasks; namespace BITKit { public static partial class TaskHelper { public static async Task WaitUntil(Func func) { try { await WaitUntil(func, BITApp.CancellationToken); } catch (OperationCanceledException) { } } public static async Task WaitUntil(Func func, CancellationToken cancelToken) { while (func is not null && func() is false) { cancelToken.ThrowIfCancellationRequested(); await Task.Delay(64); } } public static async UniTask UniTaskFunc(this Func self) { List tasks = new List(); foreach (var func in self.CastAsFunc()) { tasks.Add(func.Invoke()); } await UniTask.WhenAll(tasks); } public static async UniTask UniTaskFunc(this Func self,T0 arg0) { List tasks = new List(); foreach (var func in self.CastAsFunc()) { tasks.Add(func.Invoke(arg0)); } await UniTask.WhenAll(tasks); } public static async UniTask UniTaskFunc(this Func self,T0 arg0,T1 arg1) { List tasks = new List(); foreach (var func in self.CastAsFunc()) { tasks.Add(func.Invoke(arg0,arg1)); } await UniTask.WhenAll(tasks); } public static async UniTask UniTaskFunc(this Func self,T0 arg0,T1 arg1,T2 arg2) { if(self is null)return; List tasks = new List(); foreach (var func in self.CastAsFunc()) { tasks.Add(func.Invoke(arg0,arg1,arg2)); } await UniTask.WhenAll(tasks); } } }