WriterT によってラップされた IO から値の無限の遅延ストリームを生成しようとしています。コンジットを使用してこのストリームを消費し、ファイルに書き込みます。bind オペレーターでの IO の厳密さはよく知っていますが、そこに IO を持つこのストリームを遅延して生成するにはどうすればよいでしょうか?
無理ならレイジーSTに変えてみようかな。
import Data.Conduit
import Control.Monad.Writer
import Data.DList as DL
type Stream = WriterT (DL.DList String) IO ()
generator :: Stream
generator = do
tell $ DL.singleton "something"
generator
runStream :: Stream -> IO ()
runStream s = runResourceT $ stream s
where stream s = sourceStream s $$ sinkStream -- sinkStream just writes to a file
sourceStream s = do w <- liftIO $ execWriterT s
CL.sourceList (DL.toList w)