
Forgot to CC the list, please see below.
On Wed, Mar 30, 2011 at 2:29 PM, Mathijs Kwik
someBox :: Either A B ~> O someBox = handleA ||| handleB
Not sure about this. If you are modeling the input as Either A B, then you are excluding the possibility of both A and B occur at the same time. I suggest you change the type to: someBox :: (Maybe A, Maybe B) ~> O Based on your later comments, you implied that there could be multiple B produced from one O. Then I'd suggest the following type: someBox :: (Maybe A, [B]) ~> O
otherBox :: O ~> Either C B
Also note that in this CPS style streamprocessing, there's no 1-on-1 relation between input and output, so on 1 input (O), otherBox might produce 2 outputs (2 times C), or 4 outputs (3 times C and 1 time B).
If the number of inputs do not match the number of outputs, I suggest you change the type to: otherBox :: O ~> [Either C B]
To "wire back" B's to someBox, I'm pretty sure I need to use ArrowLoop. But (loop :: a (b, d) (c, d) -> a b c) uses tuples, which means the processing will only continue when both inputs are available. So if I turn someBox into (A, B) ~> O and otherBox into O ~> (C, B), the processing will instantly halt, waiting for a B to arrive after the A comes in.
You can do something like this, first, split the B out of the ouput: split :: [Either C B] ~> ([C], [B]) Then the loop back: loop (someBox >>> otherBox >>> split) :: Maybe A ~> [C] -- Regards, Paul Liu