You're welcome!

On 7/9/14, 1:40 AM, Kyle Van Berendonck wrote:
Thanks, and sorry for delayed reply.

I hadn't thought of doing it like how +++ does it, by just chaining the pipes.

On Wednesday, July 9, 2014 3:20:12 AM UTC+10, Gabriel Gonzalez wrote:

    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] <javascript:>.
    To post to this group, send email to [email protected]
    <javascript:>.

--
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