-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/
-- | Perhaps, a monad
--
-- Perhaps, a monad.
@package perhaps
@version 0
module Control.Monad.Perhaps
-- | This monad occupies the middle ground between Maybe and
-- Either in that you can get out an informative error but aren't
-- able to care about its contents, except via bottoms.
--
-- Since bottoms are indistinguishable in pure code, one can view this as
-- morally the same as Maybe, except when things go wrong, you can
-- pass along a complaint, rather than take what you'd get from
-- fromJust.
--
--
-- >>> import Control.Exception
--
-- >>> let x = excuse Overflow :: Perhaps ()
--
--
-- Attempting to Show a Perhaps value is hazardous, as it
-- will contain an embedded exception.
--
--
-- >>> x
-- Can't *** Exception: arithmetic overflow
--
--
-- Recovery is possible as Can't isn't strict in its argument.
--
--
-- >>> x <|> Can ()
-- Can ()
--
--
--
-- >>> x `seq` ()
-- ()
--
data Perhaps a
Can :: a -> Perhaps a
Can't :: Void -> Perhaps a
-- | This partial function can be used like fromJust, but throws
-- the user error.
believe :: Perhaps a -> a
mayhap :: Perhaps a -> Maybe a
newtype PerhapsT m a
PerhapsT :: m (Perhaps a) -> PerhapsT m a
[runPerhapsT] :: PerhapsT m a -> m (Perhaps a)
class MonadPlus m => MonadPerhaps m
-- | This is a monad homomorphism
perhaps :: MonadPerhaps m => Perhaps a -> m a
-- | This is a monad homomorphism
perhaps :: (MonadPerhaps m, m ~ t n, MonadTrans t, MonadPerhaps n) => Perhaps a -> m a
-- | Fail with an exception as an excuse instead of just a string.
excuse :: (MonadPerhaps m, Exception e) => e -> m a
-- | Transform the computation inside a PerhapsT.
--
--
mapPerhapsT :: (m (Perhaps a) -> n (Perhaps b)) -> PerhapsT m a -> PerhapsT n b
-- | Lift a callCC operation to the new monad.
liftCallCC :: CallCC m (Perhaps a) (Perhaps b) -> CallCC (PerhapsT m) a b
-- | Lift a catchE operation to the new monad.
liftCatch :: Catch e m (Perhaps a) -> Catch e (PerhapsT m) a
-- | Lift a listen operation to the new monad.
liftListen :: Monad m => Listen w m (Perhaps a) -> Listen w (PerhapsT m) a
-- | Lift a pass operation to the new monad.
liftPass :: Monad m => Pass w m (Perhaps a) -> Pass w (PerhapsT m) a
instance Data.Traversable.Traversable m => Data.Traversable.Traversable (Control.Monad.Perhaps.PerhapsT m)
instance Data.Foldable.Foldable m => Data.Foldable.Foldable (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Functor m => GHC.Base.Functor (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Functor m => GHC.Generics.Generic1 (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Generics.Generic (Control.Monad.Perhaps.PerhapsT m a)
instance Data.Traversable.Traversable Control.Monad.Perhaps.Perhaps
instance Data.Foldable.Foldable Control.Monad.Perhaps.Perhaps
instance GHC.Base.Functor Control.Monad.Perhaps.Perhaps
instance GHC.Show.Show a => GHC.Show.Show (Control.Monad.Perhaps.Perhaps a)
instance GHC.Read.Read a => GHC.Read.Read (Control.Monad.Perhaps.Perhaps a)
instance GHC.Classes.Ord a => GHC.Classes.Ord (Control.Monad.Perhaps.Perhaps a)
instance GHC.Classes.Eq a => GHC.Classes.Eq (Control.Monad.Perhaps.Perhaps a)
instance Data.Data.Data a => Data.Data.Data (Control.Monad.Perhaps.Perhaps a)
instance GHC.Generics.Generic1 Control.Monad.Perhaps.Perhaps
instance GHC.Generics.Generic (Control.Monad.Perhaps.Perhaps a)
instance GHC.Classes.Eq (m (Control.Monad.Perhaps.Perhaps a)) => GHC.Classes.Eq (Control.Monad.Perhaps.PerhapsT m a)
instance GHC.Classes.Ord (m (Control.Monad.Perhaps.Perhaps a)) => GHC.Classes.Ord (Control.Monad.Perhaps.PerhapsT m a)
instance GHC.Show.Show (m (Control.Monad.Perhaps.Perhaps a)) => GHC.Show.Show (Control.Monad.Perhaps.PerhapsT m a)
instance GHC.Read.Read (m (Control.Monad.Perhaps.Perhaps a)) => GHC.Read.Read (Control.Monad.Perhaps.PerhapsT m a)
instance (Data.Data.Data (m (Control.Monad.Perhaps.Perhaps a)), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable a) => Data.Data.Data (Control.Monad.Perhaps.PerhapsT m a)
instance Control.Monad.Perhaps.MonadPerhaps Control.Monad.Perhaps.Perhaps
instance GHC.Base.Monad m => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Perhaps.MonadPerhaps m => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.State.Lazy.StateT s m)
instance Control.Monad.Perhaps.MonadPerhaps m => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.State.Strict.StateT s m)
instance (Control.Monad.Perhaps.MonadPerhaps m, GHC.Base.Monoid w) => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.Writer.Lazy.WriterT w m)
instance (Control.Monad.Perhaps.MonadPerhaps m, GHC.Base.Monoid w) => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Monad.Perhaps.MonadPerhaps m, GHC.Base.Monoid w) => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance (Control.Monad.Perhaps.MonadPerhaps m, GHC.Base.Monoid w) => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.RWS.Strict.RWST r w s m)
instance Control.Monad.Perhaps.MonadPerhaps m => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.Reader.ReaderT r m)
instance Control.Monad.Perhaps.MonadPerhaps m => Control.Monad.Perhaps.MonadPerhaps (Control.Monad.Trans.Identity.IdentityT m)
instance GHC.Base.Monad m => GHC.Base.Applicative (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Monad m => GHC.Base.Alternative (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Monad m => GHC.Base.Monad (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Monad m => Control.Monad.Fail.MonadFail (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Monad m => GHC.Base.MonadPlus (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Zip.MonadZip m => Control.Monad.Zip.MonadZip (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Trans.Class.MonadTrans Control.Monad.Perhaps.PerhapsT
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.State.Class.MonadState s m => Control.Monad.State.Class.MonadState s (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (Control.Monad.Perhaps.PerhapsT m)
instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Control.Monad.Perhaps.PerhapsT m)
instance GHC.Base.Semigroup a => GHC.Base.Semigroup (Control.Monad.Perhaps.Perhaps a)
instance GHC.Base.Semigroup a => GHC.Base.Monoid (Control.Monad.Perhaps.Perhaps a)
instance GHC.Base.Applicative Control.Monad.Perhaps.Perhaps
instance GHC.Base.Alternative Control.Monad.Perhaps.Perhaps
instance GHC.Base.Monad Control.Monad.Perhaps.Perhaps
instance Control.Monad.Fail.MonadFail Control.Monad.Perhaps.Perhaps
instance GHC.Base.MonadPlus Control.Monad.Perhaps.Perhaps
instance Control.Monad.Fix.MonadFix Control.Monad.Perhaps.Perhaps
instance Control.Monad.Zip.MonadZip Control.Monad.Perhaps.Perhaps
module Data.Perhaps
-- | This monad occupies the middle ground between Maybe and
-- Either in that you can get out an informative error but aren't
-- able to care about its contents, except via bottoms.
--
-- Since bottoms are indistinguishable in pure code, one can view this as
-- morally the same as Maybe, except when things go wrong, you can
-- pass along a complaint, rather than take what you'd get from
-- fromJust.
--
--
-- >>> import Control.Exception
--
-- >>> let x = excuse Overflow :: Perhaps ()
--
--
-- Attempting to Show a Perhaps value is hazardous, as it
-- will contain an embedded exception.
--
--
-- >>> x
-- Can't *** Exception: arithmetic overflow
--
--
-- Recovery is possible as Can't isn't strict in its argument.
--
--
-- >>> x <|> Can ()
-- Can ()
--
--
--
-- >>> x `seq` ()
-- ()
--
data Perhaps a
Can :: a -> Perhaps a
Can't :: Void -> Perhaps a
-- | This partial function can be used like fromJust, but throws
-- the user error.
believe :: Perhaps a -> a
mayhap :: Perhaps a -> Maybe a
-- | Fail with an exception as an excuse instead of just a string.
excuse :: (MonadPerhaps m, Exception e) => e -> m a