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

Reply via email to