Is there a monad that wraps IO that has MonadWriter instance that uses the file for the writer state?
Like
newtype FileM w a = FileM (ReaderT Handle IO a) deriving (Functor, Applicative, Monad)
instance MonadWriter String (FileM String) where ...
instance MonadWriter Text (FileM Text) where ...
instance MonadWriter LazyByteString (FileM LazyByteString) where
writer (x, w) = FileM $ ReaderT \h -> do
BL.hPut h w
return x
listen m = FileM $ ReaderT \h -> do
i <- hTell h
x <- runFileM h m
i' <- hTell h
hSeek h AbsoluteSeek i
w <- BL.hGet h $ fromInteger $ i' - i
return (x, w)
pass m = FileM $ ReaderT \h -> do
i <- hTell h
(x, f) <- runFileM @LazyByteString h m
i' <- hTell h
hSeek h AbsoluteSeek i
w <- BL.hGet h $ fromInteger $ i' - i
hSetFileSize h i
hSeek h AbsoluteSeek i
BL.hPutStr h $ f w
return x
If not, is there a function like hGetContents but does not close the file handle when finished? I have an erroneous implementation here biparsing/biparsing-core/src/Control/Monad/HandleWriter.hs at f6e7f45704f71d654ca30c01fb52af5bcb1755b4 · BebeSparkelSparkel/biparsing · GitHub