If you cannot see the video, check here direct link.
If you cannot see the video, check here direct link.
Haskellの新しいIOライブラリのトリビアルなサンプルを書きました。
Conduitとは、水道管とか溝とか言う意味です。
この例は読み込みと書き込みのファイルを開いて10文字だけコピーするだけのサンプルです
do構文で組み立てられたResourceTモナドをrunResourceで実行とモナド変換を行います
このdo構文の中は大まかに分けて3つとなります。
(srcKey, rHandle) <- with (openFile src $ ReadMode) $ hClose
withを使ってリソースを確保します。
withの第一引数が確保。第二引数が開放のためです。
それぞれコンストラクタとデストラクタのようなものです。
withの返り値はタプルとなっています。このタプルの一番目がキーとなっており開放のために使います。二番目はハンドルとなっており、パイプ処理の時にSource,Sinkに変換して使います。
withSource :: Resource m => Base m aallocate -> (a -> Base m ())free resource -> ResourceT m (ReleaseKey, a)
ResourceTを組み立てる必要があります。
そのために
source -> conduit -> sink
(unixの例えでばよけばcoduitはパイプ"|")
というパイプを作り必要があります。
この例の場合
(sourceHandle rHandle) $= (isolate 10) $$ sinkHandle wHandle
該当箇所となります。
sourceHandle rHandle
sourceHandle :: ResourceIO m => Handle -> Source m ByteString
(isolate 10)
sinkHandle wHandle
sinkHandle :: ResourceIO m => Handle -> Sink ByteString m ()
となります
sourceHandle, sinkHandleはそれぞれハンドルをsource、sinkに変換する関数です。
($=)演算子はConduitを結合するための演算子です。
こうして作られたパイプコンビネータ($$)ResourceT組み立てます。
isolate :: Resource m => Int -> Conduit ByteString m ByteString
($$) :: (IsSource src, Resource m) => src m a -> Sink a m b -> ResourceT m b
($=) :: (IsSource src, Resource m) => src m a -> Conduit a m b -> Source m b
リソースの開放release関数を使って行われます
release srcKey
release :: Resource m => ReleaseKey -> ResourceT m ()