module UnliftIO.Streams.File
  ( withFileAsInput
  , withFileAsOutput
  , withFileAsOutputExt
  ) where

import           Control.Monad.IO.Unlift (MonadUnliftIO, withRunInIO)
import           Data.ByteString (ByteString)
import           System.IO (BufferMode, FilePath, IOMode)
import           System.IO.Streams (InputStream, OutputStream)
import qualified System.IO.Streams.File as SF

{-# INLINE withFileAsInput #-}
withFileAsInput :: (MonadUnliftIO m) => FilePath -> (InputStream ByteString -> m a) -> m a
withFileAsInput :: FilePath -> (InputStream ByteString -> m a) -> m a
withFileAsInput FilePath
fp InputStream ByteString -> m a
m =
  ((forall a. m a -> IO a) -> IO a) -> m a
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO (((forall a. m a -> IO a) -> IO a) -> m a)
-> ((forall a. m a -> IO a) -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    FilePath -> (InputStream ByteString -> IO a) -> IO a
forall a. FilePath -> (InputStream ByteString -> IO a) -> IO a
SF.withFileAsInput FilePath
fp (m a -> IO a
forall a. m a -> IO a
io (m a -> IO a)
-> (InputStream ByteString -> m a)
-> InputStream ByteString
-> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. InputStream ByteString -> m a
m)

{-# INLINE withFileAsOutput #-}
withFileAsOutput :: (MonadUnliftIO m) => FilePath -> (OutputStream ByteString -> m a) -> m a
withFileAsOutput :: FilePath -> (OutputStream ByteString -> m a) -> m a
withFileAsOutput FilePath
fp OutputStream ByteString -> m a
m =
  ((forall a. m a -> IO a) -> IO a) -> m a
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO (((forall a. m a -> IO a) -> IO a) -> m a)
-> ((forall a. m a -> IO a) -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    FilePath -> (OutputStream ByteString -> IO a) -> IO a
forall a. FilePath -> (OutputStream ByteString -> IO a) -> IO a
SF.withFileAsOutput FilePath
fp (m a -> IO a
forall a. m a -> IO a
io (m a -> IO a)
-> (OutputStream ByteString -> m a)
-> OutputStream ByteString
-> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OutputStream ByteString -> m a
m)

{-# INLINE withFileAsOutputExt #-}
withFileAsOutputExt :: (MonadUnliftIO m) => FilePath -> IOMode -> BufferMode -> (OutputStream ByteString -> m a) -> m a
withFileAsOutputExt :: FilePath
-> IOMode -> BufferMode -> (OutputStream ByteString -> m a) -> m a
withFileAsOutputExt FilePath
fp IOMode
ioMode BufferMode
bufMode OutputStream ByteString -> m a
m =
  ((forall a. m a -> IO a) -> IO a) -> m a
forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO (((forall a. m a -> IO a) -> IO a) -> m a)
-> ((forall a. m a -> IO a) -> IO a) -> m a
forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    FilePath
-> IOMode
-> BufferMode
-> (OutputStream ByteString -> IO a)
-> IO a
forall a.
FilePath
-> IOMode
-> BufferMode
-> (OutputStream ByteString -> IO a)
-> IO a
SF.withFileAsOutputExt FilePath
fp IOMode
ioMode BufferMode
bufMode (m a -> IO a
forall a. m a -> IO a
io (m a -> IO a)
-> (OutputStream ByteString -> m a)
-> OutputStream ByteString
-> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OutputStream ByteString -> m a
m)