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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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]); } }
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); }