using System; using System.Collections.Concurrent; namespace VRMShaders { internal sealed class TinyManagedTaskScheduler { private readonly ConcurrentQueue<(Action, Func)> _continuationQueue = new ConcurrentQueue<(Action, Func)>(); private readonly ConcurrentQueue<(Action, Func)> _temporaryQueue = new ConcurrentQueue<(Action, Func)>(); public void ManagedUpdate() { while (_continuationQueue.TryDequeue(out var tuple)) { var (continuation, canExecute) = tuple; if (canExecute()) { continuation(); } else { _temporaryQueue.Enqueue(tuple); } } while (_temporaryQueue.TryDequeue(out var tuple)) { _continuationQueue.Enqueue(tuple); } } public void Enqueue(Action continuation, Func canExecute) { _continuationQueue.Enqueue((continuation, canExecute)); } } }