10. Conduit: リスト操作
-- List の例
import
Data.Conduit
import qualified Data.Conduit.List as CL
main = do
l <- CL.sourceList [1..10] $$ CL.map (+1) =$ CL.consume
print l
-- [2,3,4,5,6,7,8,9,10,11]
12. Conduit: Core & Generalized Types
type Source m o
データの生産
type Conduit i m o
データの変換
type Sink i
データの消費
一般化したやつ
type Producer m o
type Consumer i m r
(補足:上 3 つと違って input/output が forall)
13. Conduit: Operators
各コンポーネントをつなぐ
($$) :: Source m a -> Sink a m b -> m b
connect
($=) :: Source m a -> Conduit a m b -> Source m b
fuse
(=$) :: Conduit a m b -> Sink b m c -> Sink a m c
fuse
(=$=) :: Conduit a m b -> ConduitM b c m r -> ConduitM a c m r
fuse
14. Conduit: Primitives
自分で中身を書きたいときに使う
await :: Monad m => Consumer i m (Maybe i)
上流からの入力を待つ
yield :: Monad m => o -> ConduitM i o m ()
値を下流へ流す
leftover :: i -> ConduitM i o m ()
入力の読み残しを次に渡す
17. Conduit: Internal
data Pipe l i o u m r
l: left over (otherwise Void)
i: input values
o: output values
u: upstream からの戻り値
m: ベースモナド (ex. IO)
r: 最終的な戻り値
コンストラクタは 5 種類
HaveOutput/NeedInput/Done/PipeM/Leftover
18. Conduit: Internal - Core datatype
data ConduitM i o m r
i: input values
o: output values
m: ベースモナド (最終的に返されるコンテキスト)
r: 最終的な戻り値
内部には Pipe を持っている
newtype ConduitM i o m r = ConduitM { unConduitM :: Pipe i i o () m r }
19. Conduit: Internal - Types
type Source m o = ConduitM () o m ()
type Conduit i m o = ConduitM i o m ()
type Sink i = ConduitM i Void
type Producer m o = forall i. ConduitM i o m ()
type Consumer i m r = forall o. ConduitM i o m r
すべてが Pipe