Hello,

I am rewriting some old code, and I have a design question regarding the
"right" way to interface pipes (or generic streams) and folds that may
themselves be quite complex. Currently my setup goes something like this
(this is pseudocode--haven't checked that it compiles/runs):

- I have one pipe that produces Events, where a simplified event might look
like

data Event a b = Event { myA :: a, myBs :: [b] }

- I want to loop over events and store statistics of type r; I do this by
implementing Fold(M)s:

foldA :: Fold a r

foldB :: Fold b r

- I combine the statistics using the Applicative or Monoid instances of
Fold(M):

foldEvent :: Fold (Event a b) [r]
foldEvent = sequenceA
  [ premap myA foldA
  , premap myBs $ handles folded foldB
  ]

- I then connect these stats-gathering folds to my Event Producer, which
works quite nicely.

My problem with this setup is one of complexity. In fact my Events are not
so simple, and I want to categorize them in arbitrarily complicated ways
and then feed them into the r statistics for each category. Currently all
the complexity lives in the Fold side of my code, but it seems like Pipes
are much better suited to handling non-trivial flows of information. I
wonder if it's possible to have a complicated set of Pipes that connect (at
the last second) to a bunch of Folds, which I then combine applicatively.
There's a lot of Pipes infrastructure that could make the flow easier to
understand, and I think the Pipes Monad instance may help clean up a lot of
hard-to-read Fold code. In my silly example, Pipes.Prelude.map and
Pipes.Prelude.mapFoldable are much easier to reason about (in my mind) than
Foldl.premap and "handles folded".

Unfortunately, I can't see how to implement something as simple as my
foldEvent using Pipes and still get the correct streaming properties. Is
there a solution that I am missing, or should I focus on building up more
composable primitives on the Fold side of my program?

Sorry if this is too vague: I don't want to dump a huge codebase on you,
but I can provide more examples. Questions and comments welcome!

Cheers,

Chris

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