{-# LANGUAGE DeriveFunctor #-}
module Control.Monad.Trans.OuterMaybe where
data OuterMaybeT f a = OuterNothing | OuterJust (f a) deriving (forall a b. a -> OuterMaybeT f b -> OuterMaybeT f a
forall a b. (a -> b) -> OuterMaybeT f a -> OuterMaybeT f b
forall (f :: * -> *) a b.
Functor f =>
a -> OuterMaybeT f b -> OuterMaybeT f a
forall (f :: * -> *) a b.
Functor f =>
(a -> b) -> OuterMaybeT f a -> OuterMaybeT f b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> OuterMaybeT f b -> OuterMaybeT f a
$c<$ :: forall (f :: * -> *) a b.
Functor f =>
a -> OuterMaybeT f b -> OuterMaybeT f a
fmap :: forall a b. (a -> b) -> OuterMaybeT f a -> OuterMaybeT f b
$cfmap :: forall (f :: * -> *) a b.
Functor f =>
(a -> b) -> OuterMaybeT f a -> OuterMaybeT f b
Functor)
instance (Applicative f) => Applicative (OuterMaybeT f) where
pure :: forall a. a -> OuterMaybeT f a
pure = forall (f :: * -> *) a. f a -> OuterMaybeT f a
OuterJust forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure
OuterJust f (a -> b)
fs <*> :: forall a b.
OuterMaybeT f (a -> b) -> OuterMaybeT f a -> OuterMaybeT f b
<*> OuterJust f a
xs = forall (f :: * -> *) a. f a -> OuterMaybeT f a
OuterJust forall a b. (a -> b) -> a -> b
$ f (a -> b)
fs forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f a
xs
OuterMaybeT f (a -> b)
_ <*> OuterMaybeT f a
_ = forall (f :: * -> *) a. OuterMaybeT f a
OuterNothing