0 | module Control.Monad.Maybe
13 | import Control.Monad.Trans
26 | data MaybeT : (m : Type -> Type) -> (a : Type) -> Type where
27 | MkMaybeT : m (Maybe a) -> MaybeT m a
32 | runMaybeT : MaybeT m a -> m (Maybe a)
33 | runMaybeT (MkMaybeT x) = x
41 | isNothingT : Functor m => MaybeT m a -> m Bool
42 | isNothingT = map isNothing . runMaybeT
50 | isJustT : Functor m => MaybeT m a -> m Bool
51 | isJustT = map isJust . runMaybeT
59 | maybeT : Monad m => m b -> (a -> m b) -> MaybeT m a -> m b
60 | maybeT v g x = runMaybeT x >>= maybe v g
67 | fromMaybeT : Monad m => m a -> MaybeT m a -> m a
68 | fromMaybeT v x = runMaybeT x >>= maybe v pure
77 | toMaybeT : Functor m => Bool -> m a -> MaybeT m a
78 | toMaybeT b m = MkMaybeT $
map (\a => toMaybe b a) m
83 | mapMaybeT : (m (Maybe a) -> n (Maybe a')) -> MaybeT m a -> MaybeT n a'
84 | mapMaybeT f = MkMaybeT . f . runMaybeT
91 | just : Applicative m => a -> MaybeT m a
92 | just = MkMaybeT . pure . Just
99 | nothing : Applicative m => MaybeT m a
100 | nothing = MkMaybeT $
pure Nothing
107 | Eq (m (Maybe a)) => Eq (MaybeT m a) where
108 | (==) = (==) `on` runMaybeT
111 | Ord (m (Maybe a)) => Ord (MaybeT m a) where
112 | compare = compare `on` runMaybeT
115 | Show (m (Maybe a)) => Show (MaybeT m a) where
116 | showPrec d (MkMaybeT x) = showCon d "MkMaybeT" $
showArg x
125 | Monad m => Semigroup (MaybeT m a) where
126 | MkMaybeT x <+> MkMaybeT y = MkMaybeT $
do
127 | r@(Just _) <- x | Nothing => y
131 | Monad m => Monoid (MaybeT m a) where
135 | Functor m => Functor (MaybeT m) where
136 | map f m = MkMaybeT $
map f <$> runMaybeT m
139 | Foldable m => Foldable (MaybeT m) where
140 | foldr f acc (MkMaybeT e)
141 | = foldr (\x,xs => maybe xs (`f` xs) x) acc e
143 | null (MkMaybeT e) = null e
146 | Traversable m => Traversable (MaybeT m) where
147 | traverse f (MkMaybeT x)
148 | = MkMaybeT <$> traverse (maybe (pure Nothing) (map Just . f)) x
151 | Applicative m => Applicative (MaybeT m) where
153 | MkMaybeT f <*> MkMaybeT x = MkMaybeT [| f <*> x |]
156 | Monad m => Monad (MaybeT m) where
157 | MkMaybeT x >>= k = MkMaybeT $
x >>= maybe (pure Nothing) (runMaybeT . k)
161 | Monad m => Alternative (MaybeT m) where
163 | MkMaybeT x <|> my = MkMaybeT $
x >>= \case
164 | r@(Just _) => pure r
165 | Nothing => runMaybeT my
168 | MonadTrans MaybeT where
169 | lift = MkMaybeT . map Just
172 | HasIO m => HasIO (MaybeT m) where
173 | liftIO act = MkMaybeT $
liftIO (io_bind act (pure . Just))