-- 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)