예제 #1
0
        public RoundRobinFanOut(int n)
        {
            _n = n;

            Shape = new UniformFanOutShape <T, T>(_n);

            In      = Shape.In;
            Outlets = Shape.Outs;
        }
예제 #2
0
        public UnzipEnumerable(Func <TIn, IImmutableList <TOut> > unzipper, int n)
        {
            _unzipper = unzipper;
            _n        = n;

            Shape = new UniformFanOutShape <TIn, TOut>(n);

            Outlets = Shape.Outs;
            In      = Shape.In;
        }
예제 #3
0
        internal static Outlet <TOut> FindOut <TIn, TOut, T>(Builder <T> builder, UniformFanOutShape <TIn, TOut> junction, int n)
        {
            var count = junction.Outlets.Count();

            while (n < count)
            {
                var outlet = junction.Out(n);
                if (builder.Module.Downstreams.ContainsKey(outlet))
                {
                    n++;
                }
                else
                {
                    return(outlet);
                }
            }

            throw new ArgumentException("No more outlets on junction");
        }
예제 #4
0
        public static GraphDsl.ReverseOps <TIn, TMat> Via <TIn, TOut, TMat>(this GraphDsl.ReverseOps <TIn, TMat> ops, UniformFanOutShape <TIn, TOut> junction)
            where TIn : TOut
        {
            var b = From(ops, junction);

            return(b.To(junction.In));
        }
예제 #5
0
        public static GraphDsl.Builder <TMat> From <TIn, TOut1, TOut2, TMat>(this GraphDsl.ReverseOps <TIn, TMat> ops, UniformFanOutShape <TOut1, TOut2> junction)
            where TIn : TOut2
        {
            var b     = ops.Builder;
            var count = junction.Outlets.Count();

            for (var n = 0; n < count; n++)
            {
                var outlet = junction.Out(n);
                if (!b.Module.Downstreams.ContainsKey(outlet))
                {
                    b.AddEdge(outlet, ops.In);
                    return(b);
                }
            }

            throw new ArgumentException("No more inlets free on junction", nameof(junction));
        }
예제 #6
0
        public static GraphDsl.ForwardOps <TOut2, TMat> Via <TIn, TOut1, TOut2, TMat>(this GraphDsl.ForwardOps <TOut1, TMat> ops, UniformFanOutShape <TIn, TOut2> junction)
            where TIn : TOut1
        {
            var outlet = Bind(ops, junction);

            return(ops.Builder.From(outlet));
        }
예제 #7
0
        private static Outlet <TOut2> Bind <TIn, TOut1, TOut2, TMat>(GraphDsl.ForwardOps <TOut1, TMat> ops, UniformFanOutShape <TIn, TOut2> junction) where TIn : TOut1
        {
            var b = ops.Builder;

            b.AddEdge(ops.Out, junction.In);
            return(GraphDsl.FindOut(b, junction, 0));
        }
예제 #8
0
        public static GraphDsl.Builder <TMat> To <TIn, TOut1, TOut2, TMat>(this GraphDsl.ForwardOps <TOut1, TMat> ops, UniformFanOutShape <TIn, TOut2> junction)
            where TIn : TOut1
        {
            var b = ops.Builder;

            if (!b.Module.Upstreams.ContainsKey(junction.In))
            {
                b.AddEdge(ops.Out, junction.In);
                return(b);
            }

            throw new ArgumentException("No more inlets free on junction", nameof(junction));
        }
예제 #9
0
 public ReverseOps <TIn, T> To <TIn, TOut>(UniformFanOutShape <TIn, TOut> fanOut)
 {
     return(new ReverseOps <TIn, T>(this, fanOut.In));
 }
예제 #10
0
 public ForwardOps <TOut, T> From <TIn, TOut>(UniformFanOutShape <TIn, TOut> fanOut)
 {
     return(new ForwardOps <TOut, T>(this, FindOut(this, fanOut, 0)));
 }
예제 #11
0
        public async Task RunnableGraphMadeOfBackpressuredQueueAndActorRefWithAckWorksAsExpected()
        {
            const int MAX = 4;

            Source <int, ISourceQueueWithComplete <int> > source = Source.Queue <int>(MAX, OverflowStrategy.Backpressure);
            TestProbe probe = CreateTestProbe();
            Sink <IEnumerable <int>, NotUsed> sink = Sink.ActorRefWithAck <IEnumerable <int> >(probe.Ref, "init", "ack", "complete");

            RunnableGraph <ISourceQueueWithComplete <int> > rg = RunnableGraph.FromGraph(GraphDsl.Create(source, sink, Keep.Left,
                                                                                                         (builder, source_, sink_) =>
            {
                UniformFanOutShape <int, int> broadcaster = builder.Add(new Broadcast <int>(2));
                UniformFanInShape <IEnumerable <int>, IEnumerable <int> > merger = builder.Add(new Merge <IEnumerable <int> >(2));

                var f1 = Flow.Create <int>().Aggregate(new List <int>(),
                                                       (agg, curr) =>
                {
                    agg.Add(curr);
                    return(agg);
                }).Select(list => list.AsEnumerable());
                var f2 = Flow.Create <int>().Aggregate(new List <int>(),
                                                       (agg, curr) =>
                {
                    agg.Add(curr);
                    return(agg);
                }).Select(list => list.AsEnumerable());

                builder.From(source_).To(broadcaster.In);
                builder.From(broadcaster.Out(0)).Via(f1).To(merger.In(0));
                builder.From(broadcaster.Out(1)).Via(f2).To(merger.In(1));
                builder.From(merger.Out).To(sink_);

                return(ClosedShape.Instance);
            }));

            ISourceQueueWithComplete <int> q = rg.Run(_materializer);

            probe.ExpectMsg <string>((msg, sender) =>
            {
                if (msg != "init")
                {
                    throw new InvalidOperationException($"Expected: init. Found: {msg}");
                }
                sender.Tell("ack");
            });
            await q.OfferAsync(2);

            await q.OfferAsync(4);

            await q.OfferAsync(8);

            await q.OfferAsync(16);

            q.Complete();
            await q.WatchCompletionAsync();

            probe.ExpectMsg <IEnumerable <int> >((msg, sender) =>
            {
                Assert.Equal(new[] { 2, 4, 8, 16 }.AsEnumerable(), msg);
                sender.Tell("ack");
            });
            probe.ExpectMsg <IEnumerable <int> >((msg, sender) =>
            {
                Assert.Equal(new[] { 2, 4, 8, 16 }.AsEnumerable(), msg);
                sender.Tell("ack");
            });

            probe.ExpectMsg("complete");
            probe.ExpectNoMsg();
        }