You can do this using `Pipes.Extras.(+++)`:

    p1 :: Pipe a d m r
    p2 :: Pipe b e m r
    p3 :: Pipe c f m r

(p1 +++ p2) +++ p3 :: Pipe (Either (Either a b) c) (Either (Either d e) f) m r

Then all you have to do is just stick `Pipes.Prelude.map` upstream of that to convert a `Signal` to a nested `Either`, and then also stick a `Pipes.Prelude.map` downstream of that to unify your handlers. I think it would look like this, but I haven't type-checked this yet:

    dispatcher :: Mode p p' e c m -> Pipe (Signal e c p) p' m ()
    dispatcher mode =
            Pipes.Prelude.map toEither
>-> ((handlePacket mode +++ handleEvent mode) +++ handleCommand mode)
        >-> Pipes.Prelude.map fromEither
      where
        toEither s = case s of
            SigPacket  p -> Left (Left p)
            SigEvent   e -> Left (Right e)
            SigCommand c -> Right c

        fromEithere = case e of
            Left (Left  p')) -> p'
            Left (Right p')) -> p'
            Right       p'   -> p'

That will preserve the individual state of each handler.

On 7/8/14, 8:09 AM, Kyle Van Berendonck wrote:
I have a sum type which looks like this:

    data Signal e c p = SigEvent e | SigCommand c | SigPacket p


I would like the user to be able to provide functions:

    type Handler p p' m = Pipe p p' m ()
    data Mode p p' e c m = Mode
        { handlePacket  :: Handler p p' m
        , handleEvent   :: Handler e p' m
        , handleCommand :: Handler c p' m }


and have my single input pipe (dispatcher :: Pipe (Signal e c p) p' m ()) fork between the three handlers, while preserving the state of each. ie, one handling commands may use `await` but the next packet could be an event, so it would stay in await until a command arrives. One handler pipe quitting/finishing should result in all quitting.

I would not like intermediate containers or forking threads to be part of the solution, since it will be a tight loop.

Ideally, I need something like `next` which can be called in the other direction. Ideas?
--
You received this message because you are subscribed to the Google Groups "Haskell Pipes" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To post to this group, send email to [email protected] <mailto:[email protected]>.

--
You received this message because you are subscribed to the Google Groups "Haskell 
Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to