次のテキストファイルをENDが来る手前まで読み込みたい。
hogehoge.txt
waiwai
weiwei
yahoo
END
hoge
hoge
ConduitをtakeWhile :: (a -> Bool) -> [a] -> [a]
みたいにして作りたい!
conduit_sample.hs
{-# LANGUAGE OverloadedStrings #-}
import Data.Conduit
import qualified Data.Conduit.Binary as CB
import qualified Data.Conduit.List as CL
takeWhile' :: Monad m => (a -> Bool) -> Conduit a m a
takeWhile' f = do
mx <- await
case mx of
Nothing -> return ()
Just x
| f x -> yield x >> takeWhile' f
| otherwise -> return ()
main = do
ss <-
runResourceT $
CB.sourceFile "hogehoge"
$= CB.lines
$= takeWhile' (/= "END")
$$ CL.consume
print ss
これでいい気がする。すごくMonadを普通に書くだけだった。
参考文献