-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | A monadic buffer resilient to exceptions
--
-- Please see README.md
@package safe-buffer-monad
@version 0.1.0
module SafeBuffer
class Monad m => SafeBufferMonad s m | m -> s
-- | Retrieves the buffer's current content.
readBuffer :: SafeBufferMonad s m => m s
-- | Appends a message to the buffer.
writeBuffer :: SafeBufferMonad s m => s -> m ()
-- | Retrieves the buffer's current content before clearing it.
clearBuffer :: SafeBufferMonad s m => m s
-- | Applies a given function to the buffer's content.
modifyBuffer :: SafeBufferMonad s m => (s -> s) -> m ()
newtype SafeBufferT s m a
SafeBufferT :: ReaderT (IORef s) m a -> SafeBufferT s m a
[runBufferT] :: SafeBufferT s m a -> ReaderT (IORef s) m a
-- | Runs a buffer and applies a given function to it. If any exception
-- occurs while running the buffer, the function still runs before the
-- exception is rethrown.
runBuffer :: forall s m a b. (MonadIO m, MonadMask m, Monoid s) => (s -> m b) -> SafeBufferT s m a -> m a
-- | Runs a buffer and returns it, along with either an exception or the
-- computation's result.
--
-- It purposefully does NOT catch async exceptions. To understand why,
-- see Asynchronous exception handling in Haskell.
tryRunBuffer :: forall e s m a. (MonadIO m, MonadCatch m, Monoid s, Exception e) => SafeBufferT s m a -> m (s, Either e a)
-- | Runs a buffer and swallow exceptions of type e.
--
-- It purposefully does NOT catch async exceptions. To understand why,
-- see Asynchronous exception handling in Haskell.
execBuffer :: forall e s m a. (MonadIO m, MonadCatch m, Monoid s, Exception e) => SafeBufferT s m a -> m s
newtype SafeBufferConcurrentT s m a
SafeBufferConcurrentT :: ReaderT (TVar s) m a -> SafeBufferConcurrentT s m a
[runBufferConcurrentT] :: SafeBufferConcurrentT s m a -> ReaderT (TVar s) m a
-- | Runs a buffer that can be safely shared accross threads and applies a
-- given function to it. If an exception occurs while running the buffer,
-- the function still runs before the exception is rethrown.
runBufferConcurrently :: forall s m a b. (MonadIO m, MonadMask m, Monoid s) => (s -> m b) -> SafeBufferConcurrentT s m a -> m a
-- | Runs a buffer that can be safely shared accross threads and returns
-- it, along with either an exception or the computation's result.
--
-- It purposefully does NOT catch async exceptions. To understand why,
-- see Asynchronous exception handling in Haskell.
tryRunBufferConcurrently :: forall e s m a. (MonadIO m, MonadCatch m, Monoid s, Exception e) => SafeBufferConcurrentT s m a -> m (s, Either e a)
-- | Runs a buffer that can be safely shared accross threads, and swallows
-- exceptions of type e.
--
-- It purposefully does NOT catch async exceptions. To understand why,
-- see Asynchronous exception handling in Haskell.
execBufferConcurrently :: forall e s m a. (MonadIO m, MonadCatch m, Monoid s, Exception e) => SafeBufferConcurrentT s m a -> m s
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (SafeBuffer.SafeBufferConcurrentT s m)
instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Zip.MonadZip m => Control.Monad.Zip.MonadZip (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Writer.Class.MonadWriter r m => Control.Monad.Writer.Class.MonadWriter r (SafeBuffer.SafeBufferConcurrentT s m)
instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader (GHC.Conc.Sync.TVar s) (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Trans.Class.MonadTrans (SafeBuffer.SafeBufferConcurrentT s)
instance GHC.Base.Monad m => GHC.Base.Monad (SafeBuffer.SafeBufferConcurrentT s m)
instance GHC.Base.Alternative m => GHC.Base.Alternative (SafeBuffer.SafeBufferConcurrentT s m)
instance GHC.Base.Applicative m => GHC.Base.Applicative (SafeBuffer.SafeBufferConcurrentT s m)
instance GHC.Base.Functor m => GHC.Base.Functor (SafeBuffer.SafeBufferConcurrentT s m)
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (SafeBuffer.SafeBufferT s m)
instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Fail.MonadFail m => Control.Monad.Fail.MonadFail (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Error.Class.MonadError e m => Control.Monad.Error.Class.MonadError e (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Zip.MonadZip m => Control.Monad.Zip.MonadZip (SafeBuffer.SafeBufferT s m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Writer.Class.MonadWriter r m => Control.Monad.Writer.Class.MonadWriter r (SafeBuffer.SafeBufferT s m)
instance GHC.Base.Monad m => Control.Monad.Reader.Class.MonadReader (GHC.IORef.IORef s) (SafeBuffer.SafeBufferT s m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (SafeBuffer.SafeBufferT s m)
instance Control.Monad.Trans.Class.MonadTrans (SafeBuffer.SafeBufferT s)
instance GHC.Base.Monad m => GHC.Base.Monad (SafeBuffer.SafeBufferT s m)
instance GHC.Base.Alternative m => GHC.Base.Alternative (SafeBuffer.SafeBufferT s m)
instance GHC.Base.Applicative m => GHC.Base.Applicative (SafeBuffer.SafeBufferT s m)
instance GHC.Base.Functor m => GHC.Base.Functor (SafeBuffer.SafeBufferT s m)
instance (Control.Monad.IO.Class.MonadIO m, GHC.Base.Monoid s) => SafeBuffer.SafeBufferMonad s (SafeBuffer.SafeBufferConcurrentT s m)
instance (Control.Monad.IO.Class.MonadIO m, GHC.Base.Monoid s) => SafeBuffer.SafeBufferMonad s (SafeBuffer.SafeBufferT s m)