
Henrik Berg wrote:
Thomas Hallgren
writes: ... All I want to do is to resend the input out on the output.
If that is all you want, this combinator is the right choice:
throughF :: F a b -> F a (Either b a)
Yes, but (Either b a) won't give me the input _together_ with the output, will it? I need a fudget that accepts some input, does some work on it, and outputs the result _and_ the original input for further processing by other fudgets. As far as I can see, this means I need a tupple (a, b), and not the disjoint sum (Either a b).
Aha, I suspected you wanted something more :-)
Fudgets are asynchronous in nature, so there is no single right way to
merge two streams into a stream of pairs, and I guess that is why there
is no combinator for it in the library. Here is some code I found in an
old example, illustrating one way to do it...
collectF :: F (Either a b) (a,b)
collectF = absF (collectSP Nothing Nothing)
collectSP :: Maybe a -> Maybe b -> SP (Either a b) (a,b)
collectSP x y =
case (x,y) of
(Just x,Just y) -> putSP (x,y) (collectSP Nothing Nothing)
_ -> getSP (\msg ->
case msg of
Right y -> collectSP x (Just y)
Left x -> collectSP (Just x) y
)
-- This is how collectF was used:
--fileF = collectF>==<throughF fileDialogF>==