{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}
module Streaming.With.Lifted
( Withable (..)
, RunWithable (..)
, within
, liftActionIO
, liftThrow
, withFile
, withBinaryFile
, writeBinaryFile
, appendBinaryFile
, withBinaryFileContents
, withSystemTempFile
, withTempFile
, withSystemTempDirectory
, withTempDirectory
, MonadMask
, bracket
) where
import Streaming.ByteString (ByteStream)
import qualified Streaming.With as W
import Control.Exception (Exception)
import Control.Monad.Catch (MonadMask, bracket, throwM)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Control.Monad.Managed (Managed, managed, runManaged)
import Control.Monad.Trans.Class (lift)
import Control.Monad.Trans.Cont (ContT (..), runContT)
import System.IO (Handle, IOMode)
class (Monad w, MonadMask (WithMonad w), MonadIO (WithMonad w)) => Withable w where
type WithMonad w :: * -> *
liftWith :: (forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftAction :: WithMonad w a -> w a
instance Withable Managed where
type WithMonad Managed = IO
liftWith :: (forall r. (a -> WithMonad Managed r) -> WithMonad Managed r)
-> Managed a
liftWith = (forall r. (a -> WithMonad Managed r) -> WithMonad Managed r)
-> Managed a
forall (m :: * -> *) a.
MonadManaged m =>
(forall r. (a -> IO r) -> IO r) -> m a
managed
liftAction :: WithMonad Managed a -> Managed a
liftAction = WithMonad Managed a -> Managed a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
instance (MonadMask m, MonadIO m) => Withable (ContT r m) where
type WithMonad (ContT r m) = m
liftWith :: (forall r.
(a -> WithMonad (ContT r m) r) -> WithMonad (ContT r m) r)
-> ContT r m a
liftWith forall r. (a -> WithMonad (ContT r m) r) -> WithMonad (ContT r m) r
a = ((a -> m r) -> m r) -> ContT r m a
forall k (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (a -> m r) -> m r
forall r. (a -> WithMonad (ContT r m) r) -> WithMonad (ContT r m) r
a
liftAction :: WithMonad (ContT r m) a -> ContT r m a
liftAction = WithMonad (ContT r m) a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift
class (Withable w) => RunWithable w where
runWith :: w () -> WithMonad w ()
instance RunWithable Managed where
runWith :: Managed () -> WithMonad Managed ()
runWith = Managed () -> IO ()
Managed () -> WithMonad Managed ()
runManaged
instance (MonadMask m, MonadIO m) => RunWithable (ContT () m) where
runWith :: ContT () m () -> WithMonad (ContT () m) ()
runWith = (ContT () m () -> (() -> m ()) -> m ())
-> (() -> m ()) -> ContT () m () -> m ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip ContT () m () -> (() -> m ()) -> m ()
forall k (r :: k) (m :: k -> *) a. ContT r m a -> (a -> m r) -> m r
runContT () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return
within :: (Withable w) => w a -> (a -> WithMonad w b) -> w b
within :: w a -> (a -> WithMonad w b) -> w b
within w a
w a -> WithMonad w b
f = w a
w w a -> (a -> w b) -> w b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= WithMonad w b -> w b
forall (w :: * -> *) a. Withable w => WithMonad w a -> w a
liftAction (WithMonad w b -> w b) -> (a -> WithMonad w b) -> a -> w b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> WithMonad w b
f
liftActionIO :: (Withable w) => IO a -> w a
liftActionIO :: IO a -> w a
liftActionIO = WithMonad w a -> w a
forall (w :: * -> *) a. Withable w => WithMonad w a -> w a
liftAction (WithMonad w a -> w a) -> (IO a -> WithMonad w a) -> IO a -> w a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO a -> WithMonad w a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO
liftThrow :: (Withable w, Exception e) => e -> w a
liftThrow :: e -> w a
liftThrow = WithMonad w a -> w a
forall (w :: * -> *) a. Withable w => WithMonad w a -> w a
liftAction (WithMonad w a -> w a) -> (e -> WithMonad w a) -> e -> w a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> WithMonad w a
forall (m :: * -> *) e a. (MonadThrow m, Exception e) => e -> m a
throwM
withFile :: (Withable w) => FilePath -> IOMode -> w Handle
withFile :: FilePath -> IOMode -> w Handle
withFile FilePath
fp IOMode
md = (forall r. (Handle -> WithMonad w r) -> WithMonad w r) -> w Handle
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath -> IOMode -> (Handle -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
FilePath -> IOMode -> (Handle -> m r) -> m r
W.withFile FilePath
fp IOMode
md)
withBinaryFile :: (Withable w) => FilePath -> IOMode -> w Handle
withBinaryFile :: FilePath -> IOMode -> w Handle
withBinaryFile FilePath
fp IOMode
md = (forall r. (Handle -> WithMonad w r) -> WithMonad w r) -> w Handle
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath -> IOMode -> (Handle -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
FilePath -> IOMode -> (Handle -> m r) -> m r
W.withBinaryFile FilePath
fp IOMode
md)
writeBinaryFile :: (Withable w) => FilePath -> ByteStream (WithMonad w) r -> w r
writeBinaryFile :: FilePath -> ByteStream (WithMonad w) r -> w r
writeBinaryFile FilePath
fp ByteStream (WithMonad w) r
inp = WithMonad w r -> w r
forall (w :: * -> *) a. Withable w => WithMonad w a -> w a
liftAction (FilePath -> ByteStream (WithMonad w) r -> WithMonad w r
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
FilePath -> ByteStream m r -> m r
W.writeBinaryFile FilePath
fp ByteStream (WithMonad w) r
inp)
appendBinaryFile :: (Withable w) => FilePath -> ByteStream (WithMonad w) r -> w r
appendBinaryFile :: FilePath -> ByteStream (WithMonad w) r -> w r
appendBinaryFile FilePath
fp ByteStream (WithMonad w) r
inp = WithMonad w r -> w r
forall (w :: * -> *) a. Withable w => WithMonad w a -> w a
liftAction (FilePath -> ByteStream (WithMonad w) r -> WithMonad w r
forall (m :: * -> *) r.
(MonadMask m, MonadIO m) =>
FilePath -> ByteStream m r -> m r
W.appendBinaryFile FilePath
fp ByteStream (WithMonad w) r
inp)
withBinaryFileContents :: (Withable w, MonadIO n) => FilePath -> w (ByteStream n ())
withBinaryFileContents :: FilePath -> w (ByteStream n ())
withBinaryFileContents FilePath
fp = (forall r. (ByteStream n () -> WithMonad w r) -> WithMonad w r)
-> w (ByteStream n ())
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath -> (ByteStream n () -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) (n :: * -> *) r.
(MonadMask m, MonadIO m, MonadIO n) =>
FilePath -> (ByteStream n () -> m r) -> m r
W.withBinaryFileContents FilePath
fp)
withSystemTempFile :: (Withable w)
=> String
-> w (FilePath, Handle)
withSystemTempFile :: FilePath -> w (FilePath, Handle)
withSystemTempFile FilePath
template = (forall r. ((FilePath, Handle) -> WithMonad w r) -> WithMonad w r)
-> w (FilePath, Handle)
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath -> ((FilePath, Handle) -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) r.
(MonadIO m, MonadMask m) =>
FilePath -> ((FilePath, Handle) -> m r) -> m r
W.withSystemTempFile FilePath
template)
withTempFile :: (Withable w)
=> FilePath
-> String
-> w (FilePath, Handle)
withTempFile :: FilePath -> FilePath -> w (FilePath, Handle)
withTempFile FilePath
dir FilePath
template = (forall r. ((FilePath, Handle) -> WithMonad w r) -> WithMonad w r)
-> w (FilePath, Handle)
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath
-> FilePath
-> ((FilePath, Handle) -> WithMonad w r)
-> WithMonad w r
forall (m :: * -> *) r.
(MonadIO m, MonadMask m) =>
FilePath -> FilePath -> ((FilePath, Handle) -> m r) -> m r
W.withTempFile FilePath
dir FilePath
template)
withSystemTempDirectory :: (Withable w)
=> String
-> w FilePath
withSystemTempDirectory :: FilePath -> w FilePath
withSystemTempDirectory FilePath
template = (forall r. (FilePath -> WithMonad w r) -> WithMonad w r)
-> w FilePath
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath -> (FilePath -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) a.
(MonadIO m, MonadMask m) =>
FilePath -> (FilePath -> m a) -> m a
W.withSystemTempDirectory FilePath
template)
withTempDirectory :: (Withable w)
=> FilePath
-> String
-> w FilePath
withTempDirectory :: FilePath -> FilePath -> w FilePath
withTempDirectory FilePath
dir FilePath
template = (forall r. (FilePath -> WithMonad w r) -> WithMonad w r)
-> w FilePath
forall (w :: * -> *) a.
Withable w =>
(forall r. (a -> WithMonad w r) -> WithMonad w r) -> w a
liftWith (FilePath
-> FilePath -> (FilePath -> WithMonad w r) -> WithMonad w r
forall (m :: * -> *) a.
(MonadMask m, MonadIO m) =>
FilePath -> FilePath -> (FilePath -> m a) -> m a
W.withTempDirectory FilePath
dir FilePath
template)