{-# LANGUAGE RankNTypes, Safe #-}
module Pipes.Safe.Prelude (
withFile,
withBinaryFile,
openFile,
openBinaryFile,
readFile,
writeFile,
allocate,
allocate_
) where
import Control.Monad.Catch (mask_)
import Control.Monad.IO.Class (MonadIO(liftIO))
import Pipes (Producer', Consumer')
import Pipes.Safe (bracket, liftBase, register, Base, MonadSafe, ReleaseKey)
import qualified Pipes.Prelude as P
import qualified System.IO as IO
import Prelude hiding (readFile, writeFile)
withFile :: MonadSafe m => FilePath -> IO.IOMode -> (IO.Handle -> m r) -> m r
withFile :: FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
file IOMode
ioMode = Base m Handle -> (Handle -> Base m ()) -> (Handle -> m r) -> m r
forall (m :: * -> *) a b c.
MonadSafe m =>
Base m a -> (a -> Base m b) -> (a -> m c) -> m c
bracket (IO Handle -> Base m Handle
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Handle -> Base m Handle) -> IO Handle -> Base m Handle
forall a b. (a -> b) -> a -> b
$ FilePath -> IOMode -> IO Handle
IO.openFile FilePath
file IOMode
ioMode) (IO () -> Base m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Base m ()) -> (Handle -> IO ()) -> Handle -> Base m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> IO ()
IO.hClose)
{-# INLINABLE withFile #-}
withBinaryFile :: MonadSafe m => FilePath -> IO.IOMode -> (IO.Handle -> m r) -> m r
withBinaryFile :: FilePath -> IOMode -> (Handle -> m r) -> m r
withBinaryFile FilePath
file IOMode
ioMode = Base m Handle -> (Handle -> Base m ()) -> (Handle -> m r) -> m r
forall (m :: * -> *) a b c.
MonadSafe m =>
Base m a -> (a -> Base m b) -> (a -> m c) -> m c
bracket (IO Handle -> Base m Handle
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Handle -> Base m Handle) -> IO Handle -> Base m Handle
forall a b. (a -> b) -> a -> b
$ FilePath -> IOMode -> IO Handle
IO.openBinaryFile FilePath
file IOMode
ioMode) (IO () -> Base m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Base m ()) -> (Handle -> IO ()) -> Handle -> Base m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> IO ()
IO.hClose)
{-# INLINABLE withBinaryFile #-}
openFile :: MonadSafe m => FilePath -> IO.IOMode -> m (ReleaseKey, IO.Handle)
openFile :: FilePath -> IOMode -> m (ReleaseKey, Handle)
openFile FilePath
file IOMode
ioMode = Base m Handle -> (Handle -> Base m ()) -> m (ReleaseKey, Handle)
forall (m :: * -> *) a.
MonadSafe m =>
Base m a -> (a -> Base m ()) -> m (ReleaseKey, a)
allocate (IO Handle -> Base m Handle
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Handle -> Base m Handle) -> IO Handle -> Base m Handle
forall a b. (a -> b) -> a -> b
$ FilePath -> IOMode -> IO Handle
IO.openFile FilePath
file IOMode
ioMode) (IO () -> Base m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Base m ()) -> (Handle -> IO ()) -> Handle -> Base m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> IO ()
IO.hClose)
{-# INLINABLE openFile #-}
openBinaryFile :: MonadSafe m => FilePath -> IO.IOMode -> m (ReleaseKey, IO.Handle)
openBinaryFile :: FilePath -> IOMode -> m (ReleaseKey, Handle)
openBinaryFile FilePath
file IOMode
ioMode = Base m Handle -> (Handle -> Base m ()) -> m (ReleaseKey, Handle)
forall (m :: * -> *) a.
MonadSafe m =>
Base m a -> (a -> Base m ()) -> m (ReleaseKey, a)
allocate (IO Handle -> Base m Handle
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Handle -> Base m Handle) -> IO Handle -> Base m Handle
forall a b. (a -> b) -> a -> b
$ FilePath -> IOMode -> IO Handle
IO.openBinaryFile FilePath
file IOMode
ioMode) (IO () -> Base m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> Base m ()) -> (Handle -> IO ()) -> Handle -> Base m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> IO ()
IO.hClose)
{-# INLINABLE openBinaryFile #-}
readFile :: MonadSafe m => FilePath -> Producer' String m ()
readFile :: FilePath -> Producer' FilePath m ()
readFile FilePath
file = FilePath
-> IOMode
-> (Handle -> Proxy x' x () FilePath m ())
-> Proxy x' x () FilePath m ()
forall (m :: * -> *) r.
MonadSafe m =>
FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
file IOMode
IO.ReadMode Handle -> Proxy x' x () FilePath m ()
forall (m :: * -> *) x' x.
MonadIO m =>
Handle -> Proxy x' x () FilePath m ()
P.fromHandle
{-# INLINABLE readFile #-}
writeFile :: MonadSafe m => FilePath -> Consumer' String m r
writeFile :: FilePath -> Consumer' FilePath m r
writeFile FilePath
file = FilePath
-> IOMode
-> (Handle -> Proxy () FilePath y' y m r)
-> Proxy () FilePath y' y m r
forall (m :: * -> *) r.
MonadSafe m =>
FilePath -> IOMode -> (Handle -> m r) -> m r
withFile FilePath
file IOMode
IO.WriteMode ((Handle -> Proxy () FilePath y' y m r)
-> Proxy () FilePath y' y m r)
-> (Handle -> Proxy () FilePath y' y m r)
-> Proxy () FilePath y' y m r
forall a b. (a -> b) -> a -> b
$ \Handle
h -> Handle -> Consumer' FilePath m r
forall (m :: * -> *) r.
MonadIO m =>
Handle -> Consumer' FilePath m r
P.toHandle Handle
h
{-# INLINABLE writeFile #-}
allocate :: MonadSafe m =>
Base m a
-> (a -> Base m ())
-> m (ReleaseKey, a)
allocate :: Base m a -> (a -> Base m ()) -> m (ReleaseKey, a)
allocate Base m a
acq a -> Base m ()
rel = m (ReleaseKey, a) -> m (ReleaseKey, a)
forall (m :: * -> *) a. MonadMask m => m a -> m a
mask_ (m (ReleaseKey, a) -> m (ReleaseKey, a))
-> m (ReleaseKey, a) -> m (ReleaseKey, a)
forall a b. (a -> b) -> a -> b
$ do
a
a <- Base m a -> m a
forall (m :: * -> *) r. MonadSafe m => Base m r -> m r
liftBase Base m a
acq
ReleaseKey
key <- Base m () -> m ReleaseKey
forall (m :: * -> *). MonadSafe m => Base m () -> m ReleaseKey
register (a -> Base m ()
rel a
a)
(ReleaseKey, a) -> m (ReleaseKey, a)
forall (m :: * -> *) a. Monad m => a -> m a
return (ReleaseKey
key, a
a)
allocate_ :: MonadSafe m =>
Base m a
-> (Base m ())
-> m ReleaseKey
allocate_ :: Base m a -> Base m () -> m ReleaseKey
allocate_ Base m a
acq Base m ()
rel = ((ReleaseKey, a) -> ReleaseKey)
-> m (ReleaseKey, a) -> m ReleaseKey
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (ReleaseKey, a) -> ReleaseKey
forall a b. (a, b) -> a
fst (Base m a -> (a -> Base m ()) -> m (ReleaseKey, a)
forall (m :: * -> *) a.
MonadSafe m =>
Base m a -> (a -> Base m ()) -> m (ReleaseKey, a)
allocate Base m a
acq (Base m () -> a -> Base m ()
forall a b. a -> b -> a
const Base m ()
rel))