22 Aug 2012 22:19
Conduit: Where to run monad stacks?
Niklas Hambüchen <mail <at> nh2.me>
2012-08-22 20:19:54 GMT
2012-08-22 20:19:54 GMT
Today I was surprised that transPipe is called for every chunk of data going through my pipe, rendering the StateT I put in useless, because it was always restarted with the initial value. It would be nice to have some explanation about this, as it makes it easy to write compiling code that has completely unexpected behaviour. I wrote this function (also on http://hpaste.org/73538): conduitWithState :: (MonadIO m) => Conduit Int (StateT Int m) String conduitWithState = do liftIO $ putStrLn $ "Counting Int->String converter ready!" awaitForever $ \x -> do i <- lift get lift $ modify (+1) liftIO $ putStrLn $ "Converting " ++ show x ++ " to a string! " ++ "Processed so far: " ++ show i yield (show x) and ran it like this: countingConverterConduit :: (MonadIO m) => Conduit Int m String countingConverterConduit = transPipe (\stateTint -> evalStateT stateTint 1) conduitWithState main :: IO () main = do stringList <- CL.sourceList [4,1,9,7,3] $= countingConverterConduit $$ CL.consume(Continue reading)
RSS Feed