One more simplification: we don't really need a custom type SAM for Multifunction. We can rewrite mapMulti as: mapMulti(BiBlock<Downstream<T>, T>)) and move the Downstream class declaration to Stream, and XxxMultifunction go away. mapMulti is still not a great name. How about "explode" ?