Example #1
0
        public void SwitchCOnCellLoop()
        {
            ValueTuple <DiscreteCell <int>, DiscreteCellSink <int>, DiscreteCellSink <int>, DiscreteCellSink <DiscreteCell <int> > > t = Transaction.Run(() =>
            {
                DiscreteCellLoop <DiscreteCell <int> > loop = DiscreteCell.CreateLoop <DiscreteCell <int> >();
                DiscreteCellSink <int> c1 = DiscreteCell.CreateSink(1);
                DiscreteCellSink <int> c2 = DiscreteCell.CreateSink(11);
                DiscreteCell <int> c      = loop.SwitchC();
                DiscreteCellSink <DiscreteCell <int> > s = DiscreteCell.CreateSink(c1.AsDiscreteCell());
                loop.Loop(s);
                return(ValueTuple.Create(c, c1, c2, s));
            });

            List <int> output = new List <int>();
            IListener  l      = t.Item1.Listen(output.Add);

            t.Item2.Send(2);
            t.Item3.Send(12);

            Transaction.RunVoid(() =>
            {
                t.Item2.Send(3);
                t.Item3.Send(13);
                t.Item4.Send(t.Item3);
            });

            t.Item2.Send(4);
            t.Item3.Send(14);

            l.Unlisten();

            CollectionAssert.AreEqual(new[] { 1, 2, 13, 14 }, output);
        }
Example #2
0
        public void TestLoopCell()
        {
            DiscreteCellSink <int> ca = DiscreteCell.CreateSink(22);
            ValueTuple <DiscreteCellLoop <int>, DiscreteCell <int>, DiscreteCell <int> > c = Transaction.Run(() =>
            {
                DiscreteCellLoop <int> cbLocal = DiscreteCell.CreateLoop <int>();
                DiscreteCell <int> ccLocal     = ca.Map(x => x % 10).Lift(cbLocal, (x, y) => x * y);
                DiscreteCell <int> cbOut       = ca.Map(x => x / 10);
                cbLocal.Loop(cbOut);
                return(ValueTuple.Create(cbLocal, cbOut, ccLocal));
            });
            DiscreteCellLoop <int> cb   = c.Item1;
            DiscreteCell <int>     cb2  = c.Item2;
            DiscreteCell <int>     cc   = c.Item3;
            List <int>             @out = new List <int>();
            List <int>             out2 = new List <int>();
            List <int>             out3 = new List <int>();
            IListener l  = cb.Listen(@out.Add);
            IListener l2 = cb2.Listen(out2.Add);
            IListener l3 = cc.Listen(out3.Add);

            ca.Send(2);
            ca.Send(52);
            l3.Unlisten();
            l2.Unlisten();
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 2, 0, 5 }, @out.ToArray());
            CollectionAssert.AreEqual(new[] { 2, 0, 5 }, out2.ToArray());
            CollectionAssert.AreEqual(new[] { 4, 0, 10 }, out3.ToArray());
        }
Example #3
0
        public void TestLoop()
        {
            Tuple <DiscreteCell <int>, DiscreteCellStreamSink <int> > result = Transaction.Run(() =>
            {
                DiscreteCellLoop <int> loop         = DiscreteCell.CreateLoop <int>();
                DiscreteCell <int> cLocal           = loop.Map(v => v * 5);
                DiscreteCellStreamSink <int> sLocal = new DiscreteCellStreamSink <int>();
                loop.Loop(sLocal.Hold(3));
                return(Tuple.Create(cLocal, sLocal));
            });

            DiscreteCell <int>           c = result.Item1;
            DiscreteCellStreamSink <int> s = result.Item2;

            List <int> output1 = new List <int>();
            List <int> output2 = new List <int>();
            IListener  l       = c.Listen(output1.Add);
            IListener  l2      = c.Updates.Listen(output2.Add);

            s.Send(5);
            s.Send(7);

            l2.Unlisten();
            l.Unlisten();

            CollectionAssert.AreEqual(new[] { 15, 25, 35 }, output1);
            CollectionAssert.AreEqual(new[] { 25, 35 }, output2);
        }
Example #4
0
        public async Task TestListenAsync()
        {
            DiscreteCellSink <int> a  = DiscreteCell.CreateSink(1);
            DiscreteCell <int>     a1 = a.Map(x => x + 1);
            DiscreteCell <int>     a2 = a.Map(x => x * 2);
            ValueTuple <List <int>, DiscreteCellLoop <int>, IListener> resultsAndCalled = Transaction.Run(() =>
            {
                DiscreteCell <int> result         = a1.Lift(a2, (x, y) => x + y);
                Stream <Unit> incrementStream     = Operational.Value(result.Cell).MapTo(Unit.Value);
                StreamSink <Unit> decrementStream = Stream.CreateSink <Unit>();
                DiscreteCellLoop <int> calledLoop = DiscreteCell.CreateLoop <int>();
                calledLoop.Loop(incrementStream.MapTo(1).Merge(decrementStream.MapTo(-1), (x, y) => x + y).Snapshot(calledLoop.Cell, (u, c) => c + u).Hold(0));
                List <int> r = new List <int>();
                IListener l  = result.Listen(v =>
                {
                    Task.Run(async() =>
                    {
                        await Task.Delay(900);
                        r.Add(v);
                        decrementStream.Send(Unit.Value);
                    });
                });
                return(ValueTuple.Create(r, calledLoop, l));
            });
            // ReSharper disable once UnusedVariable
            List <int>         results       = resultsAndCalled.Item1;
            DiscreteCell <int> called        = resultsAndCalled.Item2;
            List <int>         calledResults = new List <int>();
            IListener          l2            = called.Listen(calledResults.Add);

            await Task.Delay(500);

            a.Send(2);
            await Task.Delay(500);

            a.Send(3);
            await Task.Delay(2500);

            l2.Unlisten();
            resultsAndCalled.Item3.Unlisten();
        }
Example #5
0
        public void TestLiftLoopList()
        {
            ValueTuple <DiscreteCell <int>, IReadOnlyList <DiscreteCellSink <int> > > t = Transaction.Run(() =>
            {
                IReadOnlyList <DiscreteCellLoop <int> > cellLoops = Enumerable.Range(0, 50).Select(_ => DiscreteCell.CreateLoop <int>()).ToArray();
                DiscreteCell <int> sum = cellLoops.Lift().Map(v => v.Sum());
                IReadOnlyList <DiscreteCellSink <int> > cellSinks = Enumerable.Range(0, 50).Select(_ => DiscreteCell.CreateSink(1)).ToArray();
                for (int i = 0; i < 50; i++)
                {
                    cellLoops[i].Loop(cellSinks[i]);
                }
                return(ValueTuple.Create(sum, cellSinks));
            });
            List <int> @out = new List <int>();
            IListener  l    = t.Item1.Listen(@out.Add);

            t.Item2[4].Send(5);
            t.Item2[5].Send(5);
            Transaction.RunVoid(() =>
            {
                t.Item2[9].Send(5);
                t.Item2[17].Send(5);
                t.Item2[41].Send(5);
                t.Item2[48].Send(5);
            });
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 50, 54, 58, 74 }, @out);
        }