今日の初めに、実際にデータをコピーするための iteratee と進行状況を書き込むための iteratee を構成する iteratee 用の小さなテスト アプリを作成しました。私は次のような値で終わりました:
-- NOTE: this snippet is with iteratees-0.8.5.0
-- side effect: display progress on stdout
displayProgress :: Iteratee ByteString IO ()
-- side effect: copy the bytestrings of Iteratee to Handle
fileSink :: Handle -> Iteratee ByteString IO ()
writeAndDisplayProgress :: Handle -> Iteratee ByteString IO ()
writeAndDisplayProgress handle = sequence_ [fileSink handle, displayProgress]
列挙子ライブラリを見ると、sequence_
またはの類似物は見当たりませんenumWith
。私がやりたいのは、2 つの iteratee を構成して、1 つとして機能させることだけです。結果を破棄することもできます (()
とにかくそうなるでしょう) または保持することもできますが、気にしません。(&&&) from Control.Arrow は、矢印ではなく iteratees に対してのみ、私が望むものです。
私はこれらの2つのオプションを試しました:
-- NOTE: this snippet is with enumerator-0.4.10
run_ $ enumFile source $$ sequence_ [iterHandle handle, displayProgress]
run_ $ enumFile source $$ sequence_ [displayProgress, iterHandle handle]
最初のものはファイルをコピーしますが、進行状況は表示されません。2番目のものは進行状況を示しますが、ファイルをコピーしません。したがって、列挙子の反復に対する組み込みの sequence_ の効果は、最初の反復を終了するまで実行してから、もう一方を実行することです。これは私が望むものではありません。iteratees を直列ではなく並列に実行したい。明らかな何かが欠けているように感じwc
ますが、列挙子ライブラリの例を読んでいると、次の興味深いコメントが表示されます。
-- Exactly matching wc's output is too annoying, so this example
-- will just print one line per file, and support counting at most
-- one statistic per run
この発言は、列挙フレームワーク内で iteratee を組み合わせたり構成したりすることは、そのままでは不可能であることを示しているのだろうか。これを行う一般的に受け入れられている正しい方法は何ですか?
編集:
これを行う組み込みの方法はないようです。enumSequenceやmanyToOneなどのコンビネータの追加について Haskell メーリング リストで議論されていますが、これまでのところ、この機能を提供する enumerator パッケージには実際には何もないようです。