{-# LANGUAGE OverloadedStrings, PackageImports #-} import Control.Monad import "monads-tf" Control.Monad.Trans import Data.Maybe import Data.Pipe import Data.Pipe.List import Text.XML.Pipe import qualified Data.ByteString.Char8 as BSC littleIndians :: Int -> BSC.ByteString littleIndians n = "" `BSC.append` BSC.pack (show n) `BSC.append` " little, " `BSC.append` BSC.pack (show $ n + 1) `BSC.append` " little, " `BSC.append` BSC.pack (show $ n + 2) `BSC.append` " little Indians" `BSC.append` "" infiniteIndians :: [BSC.ByteString] infiniteIndians = map littleIndians [1, 4 .. ] xml :: [BSC.ByteString] xml = "" : infiniteIndians main :: IO () main = void . runPipe $ fromList xml =$= xmlEvent =$= convert fromJust =$= (xmlBegin >>= xmlNode) =$= takeP 8 =$= printP takeP :: Monad m => Int -> Pipe a a m () takeP 0 = return () takeP n = do mx <- await maybe (return ()) (\x -> yield x >> takeP (n - 1)) mx convert :: Monad m => (a -> b) -> Pipe a b m () convert f = do mx <- await maybe (return ()) (\x -> yield (f x) >> convert f) mx printP :: Show a => Pipe a () IO () printP = do mx <- await maybe (return ()) (\x -> lift (print x) >> printP) mx