In a larger program I have to parse events, and one of the events has a
start and end delimiter and then an unknown number of events in between.
Sounds like a job for pipes-parse. Here's some stripped down code to show
what I intended.
{-# LANGUAGE OverloadedStrings, LambdaCase #-}
import Pipes
import Pipes.Parse
import Pipes.Prelude
import Data.Text
import Control.Monad.State.Strict
import Control.Lens
getnums :: (Functor m, Monad m) => Parser Text m (Producer Text m ())
getnums = do
draw >>= \case
(Just "start") -> do
nums <- zoom (Pipes.Parse.span (/= "end")) $ do
undefined :: Parser Text m (Producer Text m ())
void skip
return nums
_ -> undefined
testgetnums :: IO ()
testgetnums = do
(p,rest) <- runStateT getnums $ Pipes.each
["start","1","2","3","4","end","morestuff"]
runEffect $ p >-> Pipes.Prelude.print
-- expected to print out roughly -> 1 2 3 4, with a rest producer that
has morestuff in it.
My goal is to end up with a producer that produces the numbers, without the
start or end events. I could just use drawAll and put its result into
Pipes.each, but it seems like I should be able to use zoom (span (/=
"end")) to get a parser that just has the numbers in it, and then somehow
turn that into a producer that I can return.
Am I even taking the right approach to this? Or should I be turning to
pipes group somehow? I tried that and felt like I didn't even get close to
a solution.
--
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].