+(* [pipe 'i 'o] is constructor that takes [addrt 'o] to write
+ "output" messages to this typed address, and returns
+ IO-wrapped [process 'i] that receives process messages
+ of type ['i], does anything that processes usually do,
+ and writes to specified [addrt 'o].
+type pipe 'i 'o = addrt 'o -> IO.m (process 'i)
+(* stream transform: many to many *)
+value stream_transform :
+ factory ('i * 's) ((list 'o) * 's) ->
+(* combine_pairs: combines messages tagged by `Fst and `Snd variants
+ pairwise, in the order of their arrival.
+ [`Exit_filling_snd x] is like sending [`Snd x] until all [`Fst _]
+ will be processed, then exitting the process.
+ ('a -> 'b -> IO.m unit) ->
+ | `Exit_filling_snd of 'b
+(* [server_of_pipe_seq] creates a server from pipe, assuming
+ that sequential messages sent by pipe are replies to sequential
+value server_of_pipe_seq : pipe 'i 'o -> IO.m (server 'i 'o)