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 :: forall (m :: * -> *) a.
MonadUnliftIO m =>
FilePath -> (InputStream ByteString -> m a) -> m a
withFileAsInput FilePath
fp InputStream ByteString -> m a
m =
  forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    forall a. FilePath -> (InputStream ByteString -> IO a) -> IO a
SF.withFileAsInput FilePath
fp (forall a. m a -> IO a
io 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 :: forall (m :: * -> *) a.
MonadUnliftIO m =>
FilePath -> (OutputStream ByteString -> m a) -> m a
withFileAsOutput FilePath
fp OutputStream ByteString -> m a
m =
  forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    forall a. FilePath -> (OutputStream ByteString -> IO a) -> IO a
SF.withFileAsOutput FilePath
fp (forall a. m a -> IO a
io 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 :: forall (m :: * -> *) a.
MonadUnliftIO m =>
FilePath
-> IOMode -> BufferMode -> (OutputStream ByteString -> m a) -> m a
withFileAsOutputExt FilePath
fp IOMode
ioMode BufferMode
bufMode OutputStream ByteString -> m a
m =
  forall (m :: * -> *) b.
MonadUnliftIO m =>
((forall a. m a -> IO a) -> IO b) -> m b
withRunInIO forall a b. (a -> b) -> a -> b
$ \forall a. m a -> IO a
io ->
    forall a.
FilePath
-> IOMode
-> BufferMode
-> (OutputStream ByteString -> IO a)
-> IO a
SF.withFileAsOutputExt FilePath
fp IOMode
ioMode BufferMode
bufMode (forall a. m a -> IO a
io forall b c a. (b -> c) -> (a -> b) -> a -> c
. OutputStream ByteString -> m a
m)