public void TestDeferOrder() { int x = 3; using (var defer = new Defer()) { defer.Add(() => x = x * 2); defer.Add(() => x += 1); x += 2; } Assert.AreEqual(12, x); }
/// <summary> /// Return a iterator block that executes the monad. See <see cref="IMonad{T}.Do"/>. /// </summary> public IEnumerator Do() { Executor executor = new Executor(); using (var defer = new Defer()) { defer.Add(() => { foreach (Coroutine c in executor) { c.Dispose(); } executor.Clear(); }); for (int i = 0; i < _ms.Length; ++i) { executor.Add(_ms[i].Do()); } executor.Resume(Coroutine.Delta); while (!executor.Finished) { yield return(null); executor.Resume(Coroutine.Delta); } Result = System.Array.ConvertAll(_ms, m => new CompletionStatus <T>(m)); } }
public void TestSingleDefer() { int x = 3; using (var defer = new Defer()) { defer.Add(() => x = x * 2); x += 2; } Assert.AreEqual(10, x); }
IEnumerator _DeferTestCorotuine(Data data) { data.X = 3; using (var defer = new Defer()) { defer.Add(() => data.X = data.X * 2); yield return(null); defer.Add(() => data.X += 1); yield return(null); data.X += 2; yield return(null); if (data.X > 4) { yield break; } defer.Add(() => data.X += 7); } }
/// <summary> /// Return a iterator block that executes the monad. See <see cref="IMonad{T}.Do"/>. /// </summary> public IEnumerator Do() { Executor executor = new Executor(); using (var defer = new Defer()) { defer.Add(() => { foreach (Coroutine c in executor) { c.Dispose(); } executor.Clear(); }); for (int i = 0; i < _ms.Length; ++i) { executor.Add(_Do(_ms[i])); } executor.Resume(Coroutine.Delta); while (!executor.Finished) { if (_any != null) { break; } yield return(null); executor.Resume(Coroutine.Delta); } if (_any == null) { Error = new AggregateException(Array.ConvertAll(_ms, m => m.Error)); yield break; } if (_any.Error != null) { Error = _any.Error; yield break; } Result = _any.Result; } }