2

バックグラウンド

コンテンツをコンスタント メモリにストリーミングしたい大きなファイルの長いストリームがあります。

Haskell Pipes ライブラリを使用して、次のネストされた型でこのストリームをモデル化しています。

Producer (FilePath, Producer ByteString IO ()) IO ()

つまり、外側のプロデューサーはファイルを反復処理し、内側のプロデューサーはファイル チャンクを反復処理します。

問題

会計上の目的で、このネストされたストリームを次のタイプのものに一時的にフラット化したいと思います。

Producer FileStreamEvent IO ()

どこ:

type FileStreamEvent = NestedStreamEvent FilePath ByteString

data NestedStreamEvent a b = NestedStreamOpen  a
                           | NestedStreamChunk b
                           | NestedStreamClose a

この変換を実行する関数を書くのは簡単に思えます:

flattenNestedStream :: Monad m
                    => Producer (a, Producer b m r) m r
                    -> Producer (NestedStreamEvent a b) m r
flattenNestedStream abs = for abs $ \(a, bs) -> do
    yield                $ NestedStreamOpen  a
    for bs $ \b -> yield $ NestedStreamChunk b
    yield                $ NestedStreamClose a

ただし、逆変換の書き方がわかりません。

nestFlattenedStream :: Monad m
                    => Producer (NestedStreamEvent a b) m r
                    -> Producer (a, Producer b m r) m r

そのような:

(nestFlattenedStream . flattenNestedStream) producer == producer

関数nestFlattenedStreamを定義できますか?

4

0 に答える 0