Пример #1
0
        public void TestStreamOrElse1()
        {
            StreamSink <int> a    = Stream.CreateSink <int>();
            StreamSink <int> b    = Stream.CreateSink <int>();
            Stream <int>     c    = a.OrElse(b);
            List <int>       @out = new List <int>();
            IListener        l    = c.Listen(@out.Add);

            a.Send(0);
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 0 }, @out);
            List <int> out2 = new List <int>();
            IListener  l2   = c.Listen(out2.Add);

            b.Send(10);
            l2.Unlisten();
            CollectionAssert.AreEqual(new[] { 10 }, out2);
            List <int> out3 = new List <int>();
            IListener  l3   = c.Listen(out3.Add);

            Transaction.RunVoid(() =>
            {
                a.Send(2);
                b.Send(20);
            });
            l3.Unlisten();
            CollectionAssert.AreEqual(new[] { 2 }, out3);
            List <int> out4 = new List <int>();
            IListener  l4   = c.Listen(out4.Add);

            b.Send(30);
            l4.Unlisten();
            CollectionAssert.AreEqual(new[] { 30 }, out4);
        }
Пример #2
0
        public void TestOrElseSimultaneous2()
        {
            StreamSink <int> s    = Stream.CreateSink <int>();
            Stream <int>     s2   = s.Map(x => 2 * x);
            List <int>       @out = new List <int>();
            IListener        l    = s.OrElse(s2).Listen(@out.Add);

            s.Send(7);
            s.Send(9);
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 7, 9 }, @out);
        }
Пример #3
0
        public void TestOrElseNonSimultaneous()
        {
            StreamSink <int> s1   = Stream.CreateSink <int>();
            StreamSink <int> s2   = Stream.CreateSink <int>();
            List <int>       @out = new List <int>();
            IListener        l    = s1.OrElse(s2).Listen(@out.Add);

            s1.Send(7);
            s2.Send(9);
            s1.Send(8);
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 7, 9, 8 }, @out);
        }
Пример #4
0
        public void TestOrElseSimultaneous2()
        {
            StreamSink <int> s    = new StreamSink <int>();
            Stream <int>     s2   = s.Map(x => 2 * x);
            List <int>       @out = new List <int>();

            using (s.OrElse(s2).Listen(@out.Add))
            {
                s.Send(7);
                s.Send(9);
            }
            CollectionAssert.AreEqual(new[] { 7, 9 }, @out);
        }
Пример #5
0
        public void TestOrElseNonSimultaneous()
        {
            StreamSink <int> s1   = new StreamSink <int>();
            StreamSink <int> s2   = new StreamSink <int>();
            List <int>       @out = new List <int>();

            using (s1.OrElse(s2).Listen(@out.Add))
            {
                s1.Send(7);
                s2.Send(9);
                s1.Send(8);
            }
            CollectionAssert.AreEqual(new[] { 7, 9, 8 }, @out);
        }
Пример #6
0
        public void TestStreamLoopDefer()
        {
            StreamSink <int> streamSink = Stream.CreateSink <int>();
            Stream <int>     stream     = Transaction.Run(() =>
            {
                StreamLoop <int> streamLoop = new StreamLoop <int>();
                Stream <int> streamLocal    = Operational.Defer(streamSink.OrElse(streamLoop).Filter(v => v < 5).Map(v => v + 1));
                streamLoop.Loop(streamLocal);
                return(streamLocal);
            });
            List <int> @out = new List <int>();
            IListener  l    = stream.Listen(@out.Add);

            streamSink.Send(2);
            l.Unlisten();

            CollectionAssert.AreEqual(new[] { 3, 4, 5 }, @out);
        }
Пример #7
0
        public void TestOrElseSimultaneous1()
        {
            StreamSink <int> s1   = new StreamSink <int>((l, r) => r);
            StreamSink <int> s2   = new StreamSink <int>((l, r) => r);
            List <int>       @out = new List <int>();

            using (s2.OrElse(s1).Listen(@out.Add))
            {
                Transaction.RunVoid(() =>
                {
                    s1.Send(7);
                    s2.Send(60);
                });
                Transaction.RunVoid(() =>
                {
                    s1.Send(9);
                });
                Transaction.RunVoid(() =>
                {
                    s1.Send(7);
                    s1.Send(60);
                    s2.Send(8);
                    s2.Send(90);
                });
                Transaction.RunVoid(() =>
                {
                    s2.Send(8);
                    s2.Send(90);
                    s1.Send(7);
                    s1.Send(60);
                });
                Transaction.RunVoid(() =>
                {
                    s2.Send(8);
                    s1.Send(7);
                    s2.Send(90);
                    s1.Send(60);
                });
            }
            CollectionAssert.AreEqual(new[] { 60, 9, 90, 90, 90 }, @out);
        }
Пример #8
0
        public void TestOrElseSimultaneous1()
        {
            StreamSink <int> s1   = Stream.CreateSink <int>((_, r) => r);
            StreamSink <int> s2   = Stream.CreateSink <int>((_, r) => r);
            List <int>       @out = new List <int>();
            IListener        l    = s2.OrElse(s1).Listen(@out.Add);

            Transaction.RunVoid(() =>
            {
                s1.Send(7);
                s2.Send(60);
            });
            Transaction.RunVoid(() =>
            {
                s1.Send(9);
            });
            Transaction.RunVoid(() =>
            {
                s1.Send(7);
                s1.Send(60);
                s2.Send(8);
                s2.Send(90);
            });
            Transaction.RunVoid(() =>
            {
                s2.Send(8);
                s2.Send(90);
                s1.Send(7);
                s1.Send(60);
            });
            Transaction.RunVoid(() =>
            {
                s2.Send(8);
                s1.Send(7);
                s2.Send(90);
                s1.Send(60);
            });
            l.Unlisten();
            CollectionAssert.AreEqual(new[] { 60, 9, 90, 90, 90 }, @out);
        }
Пример #9
0
        public void TestStreamOrElse1()
        {
            StreamSink <int> a    = new StreamSink <int>();
            StreamSink <int> b    = new StreamSink <int>();
            Stream <int>     c    = a.OrElse(b);
            List <int>       @out = new List <int>();

            using (c.Listen(@out.Add))
            {
                a.Send(0);
            }
            CollectionAssert.AreEqual(new[] { 0 }, @out);
            List <int> out2 = new List <int>();

            using (c.Listen(out2.Add))
            {
                b.Send(10);
            }
            CollectionAssert.AreEqual(new[] { 10 }, out2);
            List <int> out3 = new List <int>();

            using (c.Listen(out3.Add))
            {
                Transaction.RunVoid(() =>
                {
                    a.Send(2);
                    b.Send(20);
                });
            }
            CollectionAssert.AreEqual(new[] { 2 }, out3);
            List <int> out4 = new List <int>();

            using (c.Listen(out4.Add))
            {
                b.Send(30);
            }
            CollectionAssert.AreEqual(new[] { 30 }, out4);
        }
Пример #10
0
 public void TestOrElseSimultaneous2()
 {
     StreamSink<int> s = new StreamSink<int>();
     Stream<int> s2 = s.Map(x => 2 * x);
     List<int> @out = new List<int>();
     using (s.OrElse(s2).Listen(@out.Add))
     {
         s.Send(7);
         s.Send(9);
     }
     CollectionAssert.AreEqual(new[] { 7, 9 }, @out);
 }
Пример #11
0
 public void TestOrElseSimultaneous1()
 {
     StreamSink<int> s1 = new StreamSink<int>((l, r) => r);
     StreamSink<int> s2 = new StreamSink<int>((l, r) => r);
     List<int> @out = new List<int>();
     using (s2.OrElse(s1).Listen(@out.Add))
     {
         Transaction.RunVoid(() =>
         {
             s1.Send(7);
             s2.Send(60);
         });
         Transaction.RunVoid(() =>
         {
             s1.Send(9);
         });
         Transaction.RunVoid(() =>
         {
             s1.Send(7);
             s1.Send(60);
             s2.Send(8);
             s2.Send(90);
         });
         Transaction.RunVoid(() =>
         {
             s2.Send(8);
             s2.Send(90);
             s1.Send(7);
             s1.Send(60);
         });
         Transaction.RunVoid(() =>
         {
             s2.Send(8);
             s1.Send(7);
             s2.Send(90);
             s1.Send(60);
         });
     }
     CollectionAssert.AreEqual(new[] { 60, 9, 90, 90, 90 }, @out);
 }
Пример #12
0
 public void TestOrElseNonSimultaneous()
 {
     StreamSink<int> s1 = new StreamSink<int>();
     StreamSink<int> s2 = new StreamSink<int>();
     List<int> @out = new List<int>();
     using (s1.OrElse(s2).Listen(@out.Add))
     {
         s1.Send(7);
         s2.Send(9);
         s1.Send(8);
     }
     CollectionAssert.AreEqual(new[] { 7, 9, 8 }, @out);
 }
Пример #13
0
        public void TestDiscreteCellLoopComplex()
        {
            StreamSink <int> s = new StreamSink <int>();
            StreamSink <Tuple <int, int> >             addItemStreamSink     = new StreamSink <Tuple <int, int> >();
            StreamSink <IReadOnlyList <TestObject> >   removeItemsStreamSink = new StreamSink <IReadOnlyList <TestObject> >();
            DiscreteCell <IReadOnlyList <TestObject> > listCell = Transaction.Run(() =>
            {
                DiscreteCellLoop <IReadOnlyList <TestObject> > listCellLoop = new DiscreteCellLoop <IReadOnlyList <TestObject> >();
                DiscreteCell <IReadOnlyList <TestObject> > listCellLocal    =
                    addItemStreamSink.OrElse(s.Map(v => Tuple.Create(v, v))).Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(o => c => c.Concat(new[] { new TestObject(o.Item1, o.Item2) }).ToArray())
                    .Merge(removeItemsStreamSink.Map <Func <IReadOnlyList <TestObject>, IReadOnlyList <TestObject> > >(o => c => c.Except(o).ToArray()), (f, g) => c => g(f(c)))
                    .Snapshot(listCellLoop, (f, c) => f(c))
                    .Hold(new TestObject[0]);
                listCellLoop.Loop(listCellLocal);
                return(listCellLocal);
            });
            IListener l2 = Transaction.Run(() =>
            {
                return(listCell.Values.Listen(c => Transaction.Post(() =>
                {
                    if (c.Any())
                    {
                        Tuple <int, int> t = c.Last().BothNumbersCell.Cell.Sample();
                        if (t.Item1 == 9 && t.Item2 == 9)
                        {
                            addItemStreamSink.Send(Tuple.Create(0, 0));
                        }
                    }
                })));
            });
            IListener l3 = Transaction.Run(() =>
                                           listCell.Map(c => c.Select(o => o.RemoveStream.MapTo(new[] { o })).Merge((x, y) => x.Concat(y).ToArray())).SwitchS().Listen(o => Transaction.Post(() => removeItemsStreamSink.Send(o))));
            IListener l4 = Transaction.Run(() =>
                                           listCell.Map(c => c.Any() ? c.Last().Number1Cell.Lift(c.Last().Number2Cell, (x, y) => x == 9 && y == 9).Updates : Stream.Never <bool>()).SwitchS().Filter(v => v).Listen(_ => Transaction.Post(() => addItemStreamSink.Send(Tuple.Create(0, 0)))));
            List <IReadOnlyList <Tuple <int, int> > > @out = new List <IReadOnlyList <Tuple <int, int> > >();
            IListener l = listCell.Map(c => c.Select(o => o.Number1Cell.Lift(o.Number2Cell, Tuple.Create)).Lift()).SwitchC().Listen(@out.Add);

            addItemStreamSink.Send(Tuple.Create(5, 2));
            addItemStreamSink.Send(Tuple.Create(9, 2));
            listCell.Cell.Sample()[0].Remove();
            addItemStreamSink.Send(Tuple.Create(2, 9));
            listCell.Cell.Sample()[1].ChangeNumber1(9);
            addItemStreamSink.Send(Tuple.Create(9, 9));
            s.Send(5);
            s.Send(9);
            Transaction.RunVoid(() =>
            {
                addItemStreamSink.Send(Tuple.Create(5, 5));
                s.Send(5);
            });
            listCell.Cell.Sample()[8].ChangeNumber2(9);
            listCell.Cell.Sample()[8].ChangeNumber1(9);
            l.Unlisten();
            l2.Unlisten();
            l3.Unlisten();
            l4.Unlisten();

            Tuple <int, int>[][] expected =
            {
                new Tuple <int, int> [0],
                new[] { Tuple.Create(5,2) },
                new[] { Tuple.Create(5,2), Tuple.Create(9,   2) },
                new[] { Tuple.Create(9,2) },
                new[] { Tuple.Create(9,2), Tuple.Create(2,   9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9,   9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9), Tuple.Create(0, 0) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9) },
                new[] { Tuple.Create(9,2), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(5, 5), Tuple.Create(9, 9), Tuple.Create(0, 0), Tuple.Create(9, 9), Tuple.Create(0, 0) }
            };
            Assert.AreEqual(expected.Length, @out.Count);
            for (int i = 0; i < 16; i++)
            {
                CollectionAssert.AreEqual(@out[i], expected[i]);
            }
        }
Пример #14
0
 public void TestStreamOrElse1()
 {
     StreamSink<int> a = new StreamSink<int>();
     StreamSink<int> b = new StreamSink<int>();
     Stream<int> c = a.OrElse(b);
     List<int> @out = new List<int>();
     using (c.Listen(@out.Add))
     {
         a.Send(0);
     }
     CollectionAssert.AreEqual(new[] { 0 }, @out);
     List<int> out2 = new List<int>();
     using (c.Listen(out2.Add))
     {
         b.Send(10);
     }
     CollectionAssert.AreEqual(new[] { 10 }, out2);
     List<int> out3 = new List<int>();
     using (c.Listen(out3.Add))
     {
         Transaction.RunVoid(() =>
         {
             a.Send(2);
             b.Send(20);
         });
     }
     CollectionAssert.AreEqual(new[] { 2 }, out3);
     List<int> out4 = new List<int>();
     using (c.Listen(out4.Add))
     {
         b.Send(30);
     }
     CollectionAssert.AreEqual(new[] { 30 }, out4);
 }