Пример #1
0
            public void TestSwitchSValuesLoop()
            {
                DiscreteCellStreamSink <IReadOnlyList <TestObject> > streamSink = new DiscreteCellStreamSink <IReadOnlyList <TestObject> >();
                DiscreteCell <IReadOnlyList <TestObject> >           cell       = Transaction.Run(() =>
                {
                    DiscreteCellLoop <IReadOnlyList <TestObject> > cellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                    DiscreteCell <IReadOnlyList <TestObject> > cellLocal    = streamSink.Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => _ => v)
                                                                              .Merge(cellLoop.Map(oo => oo.Select(o => o.Output).Lift(vv => vv.Sum()).Values).SwitchS().Filter(sum => sum < 50).MapTo <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => v.Concat(new[] { new TestObject() }).ToArray()), (f, g) => v => g(f(v)))
                                                                              .Snapshot(cellLoop, (f, v) => f(v))
                                                                              .Hold(Enumerable.Range(1, 10).Select(_ => new TestObject()).ToArray());
                    cellLoop.Loop(cellLocal);
                    return(cellLocal);
                });

                List <int> objectCounts = new List <int>();

                objectCounts.Add(-1);
                cell.Listen(vv => objectCounts.Add(vv.Count));
                objectCounts.Add(-1);
                cell.Cell.Sample()[2].Input1.Send(1);
                objectCounts.Add(-1);
                cell.Cell.Sample()[1].Input1.Send(-20);
                objectCounts.Add(-1);
                streamSink.Send(new TestObject[0]);
                objectCounts.Add(-1);

                // Ideal result, likely not achievable.
                //CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 15, -1, 10, -1 }, objectCounts);

                // Glitchy result, also not returned by this method.
                //CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 12, 13, 14, 15, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1 }, objectCounts);

                // Incorrect result we will see.
                CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 12, -1, 0, -1 }, objectCounts);
            }
Пример #2
0
            public void TestSwitchCDeferredLoopWithBetterApi()
            {
                DiscreteCellStreamSink <IReadOnlyList <TestObject> > streamSink = new DiscreteCellStreamSink <IReadOnlyList <TestObject> >();
                DiscreteCell <IReadOnlyList <TestObject> >           cell       = Transaction.Run(() =>
                {
                    DiscreteCellLoop <IReadOnlyList <TestObject> > cellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                    DiscreteCell <IReadOnlyList <TestObject> > cellLocal    = streamSink
                                                                              .OrElse(Operational.Defer(cellLoop.Map(oo => oo.Select(o => o.Output).Lift(vv => vv.Sum())).SwitchCWithDeferredValues()).Filter(sum => sum < 50).Snapshot(cellLoop, (_, items) => (IReadOnlyList <TestObject>)items.Concat(new[] { new TestObject() }).ToArray()))
                                                                              .Hold(Enumerable.Range(1, 10).Select(_ => new TestObject()).ToArray());
                    cellLoop.Loop(cellLocal);
                    return(cellLocal);
                });

                List <int> objectCounts = new List <int>();

                objectCounts.Add(-1);
                cell.Listen(vv => objectCounts.Add(vv.Count));
                objectCounts.Add(-1);
                cell.Cell.Sample()[2].Input1.Send(1);
                objectCounts.Add(-1);
                cell.Cell.Sample()[1].Input1.Send(-20);
                objectCounts.Add(-1);
                streamSink.Send(new TestObject[0]);
                objectCounts.Add(-1);

                // Ideal result, likely not achievable.
                //CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 15, -1, 10, -1 }, objectCounts);

                // Glitchy result, but correct otherwise.
                CollectionAssert.AreEquivalent(new[] { -1, 10, -1, 11, -1, 12, 13, 14, 15, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -1 }, objectCounts);
            }
Пример #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);
        }
Пример #4
0
        public void TestMerge()
        {
            StreamSink <Unit> s = Stream.CreateSink <Unit>();
            var obj             = Transaction.Run(() =>
            {
                StreamLoop <bool> loop          = Stream.CreateLoop <bool>();
                DiscreteCellStreamSink <int> s1 = new DiscreteCellStreamSink <int>();
                DiscreteCellStreamSink <int> s2 = new DiscreteCellStreamSink <int>();
                TestObject[] l = Enumerable.Range(0, 5000).Select(_ => new TestObject(loop, s1, s2)).ToArray();
                loop.Loop(s.Snapshot(l.Select(o => o.Cell).Lift().Cell).Map(o => o.All(v => v == 0)));
                return(l);
            });

            int[] values = obj.Select(v => v.CurrentValue).ToArray();
        }
Пример #5
0
            public void TestSwitchCLoop()
            {
                Exception actual = null;

                try
                {
                    DiscreteCellStreamSink <IReadOnlyList <TestObject> > streamSink = new DiscreteCellStreamSink <IReadOnlyList <TestObject> >();
                    DiscreteCell <IReadOnlyList <TestObject> >           cell       = Transaction.Run(() =>
                    {
                        DiscreteCellLoop <IReadOnlyList <TestObject> > cellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                        DiscreteCell <IReadOnlyList <TestObject> > cellLocal    = streamSink.Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => _ => v)
                                                                                  .Merge(cellLoop.Map(oo => oo.Select(o => o.Output).Lift(vv => vv.Sum())).SwitchC().Updates.Filter(sum => sum < 50).MapTo <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(v => v.Concat(new[] { new TestObject() }).ToArray()), (f, g) => v => g(f(v)))
                                                                                  .Snapshot(cellLoop, (f, v) => f(v))
                                                                                  .Hold(Enumerable.Range(1, 10).Select(_ => new TestObject()).ToArray());
                        cellLoop.Loop(cellLocal);
                        return(cellLocal);
                    });

                    List <int> objectCounts = new List <int>();
                    objectCounts.Add(-1);
                    cell.Listen(vv => objectCounts.Add(vv.Count));
                    objectCounts.Add(-1);
                    cell.Cell.Sample()[2].Input1.Send(1);
                    objectCounts.Add(-1);
                    cell.Cell.Sample()[1].Input1.Send(-20);
                    objectCounts.Add(-1);
                    streamSink.Send(new TestObject[0]);
                    objectCounts.Add(-1);
                }
                catch (AggregateException e)
                {
                    actual = e.InnerExceptions.FirstOrDefault(ex => ex.Message == "A dependency cycle was detected.");
                }
                catch (Exception e)
                {
                    actual = e;
                }

                Assert.IsNotNull(actual);
                Assert.AreEqual("A dependency cycle was detected.", actual.Message);
            }