conduitといえば $$
や $=
=$=
のような演算子を使い分けなければいけなくて 面倒だなものだと思っていた のだが、去年の9月から .|
だけを使えばいいように変わっていた。これは直感的で使いやすい。
module Main (main) where import Data.Char (ord, chr, toUpper) import Data.Conduit (Conduit, runConduit, (.|)) import qualified Data.Conduit.Binary as B import qualified Data.Conduit.List as L import qualified Data.ByteString as BS import Data.Word (Word8) import System.IO (stdin, stdout) main :: IO () main = runConduit $ do B.sourceHandle stdin .| B.takeWhile (\c -> c /= word8 '.') .| filterUc .| B.sinkHandle stdout return () where word8 = fromIntegral . ord filterUc :: Monad m => Conduit BS.ByteString m BS.ByteString filterUc = L.map ucString where uc :: Word8 -> Word8 uc = fromIntegral . ord . toUpper . chr . fromIntegral ucString :: BS.ByteString -> BS.ByteString ucString = BS.map uc