Ejemplo n.º 1
0
        /// <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));
            }
        }
Ejemplo n.º 2
0
        public void TestEmptyDefer()
        {
            int x = 3;

            using (var defer = new Defer())
            {
                x += 2;
            }
            Assert.AreEqual(5, x);
        }
Ejemplo n.º 3
0
        public void TestSingleDefer()
        {
            int x = 3;

            using (var defer = new Defer())
            {
                defer.Add(() => x = x * 2);
                x += 2;
            }
            Assert.AreEqual(10, x);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        /// <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;
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }