Ah, okay. I misunderstood the intention of your original example, then. My bad.<p>In order to prevent further embarrassing myself, I&#x27;m going to tell you how I (currently) understand your design, and, if I&#x27;m wrong, please tell me: Your &quot;pipeline&quot; isn&#x27;t actually connecting the processes to each other. You <i>first</i> connect the processes to each other, and <i>only then</i> add them to a &quot;pipeline&quot;, whose primary (only?) responsibility is to ensure that each process runs in a different goroutine.<p>This much doesn&#x27;t really need parametric polymorphism, let alone generalized algebraic data types. However, calling it &quot;pipeline&quot; is kind of misleading, because the actual &quot;piping&quot; (connecting processes to each other) is handled elsewhere. In fact, using your &quot;pipeline&quot; abstraction, you could perfectly well run a bunch of processes that aren&#x27;t connected to each other at all.<p>Is my understanding correct?