# Fan-out & Routing ## FanoutNode Reads one item and pushes a copy to each of N output channels. All downstream nodes receive every item. ```cpp auto fan = make_fanout(/*capacity=*/8); net.connect("src", src.output<0>(), "fan", fan.input<0>()) .connect("fan", fan.output<0>(), "nodeA", nodeA.input<0>()) .connect("fan", fan.output<1>(), "nodeB", nodeB.input<0>()); ``` If one downstream channel overflows, that output drops the item independently — the other outputs are unaffected. See `examples/11_static_fanout`. ## RouterNode Reads one item and pushes it to exactly one of N outputs, chosen by a selector function: ```cpp auto router = make_router( [](const Frame& f) -> std::size_t { return f.stream_id % 3; }); net.connect("src", src.output<0>(), "router", router.input<0>()) .connect("router", router.output<0>(), "nodeA", nodeA.input<0>()) .connect("router", router.output<1>(), "nodeB", nodeB.input<0>()) .connect("router", router.output<2>(), "nodeC", nodeC.input<0>()); ``` If the selector returns `>= N` the item is silently dropped. ## FilterNode Reads one item and passes it downstream only when a predicate returns `true`: ```cpp auto filt = make_filter([](const Frame& f) { return f.valid; }); net.connect("src", src.output<0>(), "filt", filt.input<0>()) .connect("filt", filt.output<0>(), "dst", dst.input<0>()); ```