public void PairDelayedSecondaryWithInitialValue() { using (var pipeline = Pipeline.Create()) { Generators.Range(pipeline, 0, 2, TimeSpan.FromSeconds(1)); // hold pipeline open var primary = Generators.Range(pipeline, 0, 5, TimeSpan.FromTicks(1)); var secondary = Generators.Range(pipeline, 0, 5, TimeSpan.FromTicks(1)).Delay(TimeSpan.FromMilliseconds(100)); var paired = primary.Pair(secondary, 42).ToObservable().ToListObservable(); var fused = primary.Fuse(secondary, Available.LastOrDefault(42)).ToObservable().ToListObservable(); pipeline.Run(); var pairedResults = paired.AsEnumerable().ToArray(); Assert.IsTrue(Enumerable.SequenceEqual(new[] { 0, 1, 2, 3, 4 }.Zip(new[] { 42, 42, 42, 42, 42 }, ValueTuple.Create), pairedResults)); var fusedResults = fused.AsEnumerable().ToArray(); Assert.IsTrue(Enumerable.SequenceEqual(new[] { 0, 1, 2, 3, 4 }.Zip(new[] { 42, 42, 42, 42, 42 }, ValueTuple.Create), pairedResults)); } }
public void PairDelayedSecondryWithInitialValueAndOutputCreator() { using (var pipeline = Pipeline.Create()) { Generators.Range(pipeline, 0, 2, TimeSpan.FromSeconds(1)); // hold pipeline open var primary = Generators.Range(pipeline, 0, 5, TimeSpan.FromTicks(1)); var secondary = Generators.Range(pipeline, 0, 5, TimeSpan.FromTicks(1)).Delay(TimeSpan.FromMilliseconds(100)); var paired = primary.Pair(secondary, (p, s) => p * 10 + s, 7).ToObservable().ToListObservable(); var fused = primary.Fuse(secondary, Available.LastOrDefault(7), (p, s) => p * 10 + s).ToObservable().ToListObservable(); pipeline.Run(); var pairedResults = paired.AsEnumerable().ToArray(); Assert.IsTrue(Enumerable.SequenceEqual(new[] { 07, 17, 27, 37, 47 }, pairedResults)); var fusedResults = fused.AsEnumerable().ToArray(); Assert.IsTrue(Enumerable.SequenceEqual(new[] { 07, 17, 27, 37, 47 }, fusedResults)); } }
public void TupleCollapsingPairWithInitialValue() { using (var pipeline = Pipeline.Create()) { var range = Generators.Range(pipeline, 0, 10, TimeSpan.FromMilliseconds(100)); var sourceA = range.Select(x => $"A{x}"); var sourceB = range.Select(x => $"B{x}"); var sourceC = range.Select(x => $"C{x}"); var sourceD = range.Select(x => $"D{x}"); var sourceE = range.Select(x => $"E{x}"); var sourceF = range.Select(x => $"F{x}"); var sourceG = range.Select(x => $"G{x}"); var pairedTuples = // expecting tuple flattening sourceA .Pair(sourceB, "B?") .Pair(sourceC, "C?") .Pair(sourceD, "D?") .Pair(sourceE, "E?") .Pair(sourceF, "F?") .Pair(sourceG, "G?") .ToObservable().ToListObservable(); var fusedTuples = // expecting tuple flattening sourceA .Fuse(sourceB, Available.LastOrDefault("B?")) .Fuse(sourceC, Available.LastOrDefault("C?")) .Fuse(sourceD, Available.LastOrDefault("D?")) .Fuse(sourceE, Available.LastOrDefault("E?")) .Fuse(sourceF, Available.LastOrDefault("F?")) .Fuse(sourceG, Available.LastOrDefault("G?")) .ToObservable().ToListObservable(); pipeline.Run(); var pairedResults = pairedTuples.AsEnumerable().ToArray(); Assert.AreEqual(10, pairedResults.Length); // can't really validate content ordering as with Join because Pair is inherently non-deterministic foreach (var r in pairedResults) { Assert.IsTrue(r.Item1.StartsWith("A")); Assert.IsTrue(r.Item2.StartsWith("B")); Assert.IsTrue(r.Item3.StartsWith("C")); Assert.IsTrue(r.Item4.StartsWith("D")); Assert.IsTrue(r.Item5.StartsWith("E")); Assert.IsTrue(r.Item6.StartsWith("F")); Assert.IsTrue(r.Item7.StartsWith("G")); } var fusedResults = fusedTuples.AsEnumerable().ToArray(); Assert.AreEqual(10, fusedResults.Length); // can't really validate content ordering as with Join because Fuse is inherently non-deterministic foreach (var r in fusedResults) { Assert.IsTrue(r.Item1.StartsWith("A")); Assert.IsTrue(r.Item2.StartsWith("B")); Assert.IsTrue(r.Item3.StartsWith("C")); Assert.IsTrue(r.Item4.StartsWith("D")); Assert.IsTrue(r.Item5.StartsWith("E")); Assert.IsTrue(r.Item6.StartsWith("F")); Assert.IsTrue(r.Item7.StartsWith("G")); } } }