バックグラウンド
コンテンツをコンスタント メモリにストリーミングしたい大きなファイルの長いストリームがあります。
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
を定義できますか?