module MaybeVoid where

-- * Type

data MaybeVoid a = NonVoid a | Void
  deriving (Int -> MaybeVoid a -> ShowS
forall a. Show a => Int -> MaybeVoid a -> ShowS
forall a. Show a => [MaybeVoid a] -> ShowS
forall a. Show a => MaybeVoid a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MaybeVoid a] -> ShowS
$cshowList :: forall a. Show a => [MaybeVoid a] -> ShowS
show :: MaybeVoid a -> String
$cshow :: forall a. Show a => MaybeVoid a -> String
showsPrec :: Int -> MaybeVoid a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> MaybeVoid a -> ShowS
Show)

instance Eq a => Eq (MaybeVoid a) where
  NonVoid a
lhs == :: MaybeVoid a -> MaybeVoid a -> Bool
== NonVoid a
rhs = a
lhs forall a. Eq a => a -> a -> Bool
== a
rhs
  MaybeVoid a
Void == MaybeVoid a
Void = Bool
True
  MaybeVoid a
_ == MaybeVoid a
_ = Bool
False

instance Functor MaybeVoid where
  fmap :: forall a b. (a -> b) -> MaybeVoid a -> MaybeVoid b
fmap a -> b
f (NonVoid a
x) = forall a. a -> MaybeVoid a
NonVoid forall a b. (a -> b) -> a -> b
$ a -> b
f a
x
  fmap a -> b
_ MaybeVoid a
Void = forall a. MaybeVoid a
Void

instance Applicative MaybeVoid where
  pure :: forall a. a -> MaybeVoid a
pure = forall a. a -> MaybeVoid a
NonVoid

  NonVoid a -> b
a <*> :: forall a b. MaybeVoid (a -> b) -> MaybeVoid a -> MaybeVoid b
<*> NonVoid a
x = forall a. a -> MaybeVoid a
NonVoid forall a b. (a -> b) -> a -> b
$ a -> b
a a
x
  MaybeVoid (a -> b)
Void <*> MaybeVoid a
_ = forall a. MaybeVoid a
Void
  MaybeVoid (a -> b)
_ <*> MaybeVoid a
Void = forall a. MaybeVoid a
Void

instance Monad MaybeVoid where
  NonVoid a
x >>= :: forall a b. MaybeVoid a -> (a -> MaybeVoid b) -> MaybeVoid b
>>= a -> MaybeVoid b
mf = a -> MaybeVoid b
mf a
x
  MaybeVoid a
Void >>= a -> MaybeVoid b
_ = forall a. MaybeVoid a
Void

instance Foldable MaybeVoid where
  foldMap :: forall m a. Monoid m => (a -> m) -> MaybeVoid a -> m
foldMap a -> m
f (NonVoid a
x) = a -> m
f a
x
  foldMap a -> m
_ MaybeVoid a
Void = forall a. Monoid a => a
mempty

instance Traversable MaybeVoid where
  traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> MaybeVoid a -> f (MaybeVoid b)
traverse a -> f b
f (NonVoid a
x) = forall a. a -> MaybeVoid a
NonVoid forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
x
  traverse a -> f b
_ MaybeVoid a
Void = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. MaybeVoid a
Void

-- * Utils

maybeVoidToMaybe :: MaybeVoid a -> Maybe a
maybeVoidToMaybe :: forall a. MaybeVoid a -> Maybe a
maybeVoidToMaybe (NonVoid a
x) = forall a. a -> Maybe a
Just a
x
maybeVoidToMaybe MaybeVoid a
Void = forall a. Maybe a
Nothing

maybeToMaybeVoid :: Maybe a -> MaybeVoid a
maybeToMaybeVoid :: forall a. Maybe a -> MaybeVoid a
maybeToMaybeVoid (Just a
x) = forall a. a -> MaybeVoid a
NonVoid a
x
maybeToMaybeVoid Maybe a
Nothing = forall a. MaybeVoid a
Void

maybeVoid :: b -> (a -> b) -> MaybeVoid a -> b
maybeVoid :: forall b a. b -> (a -> b) -> MaybeVoid a -> b
maybeVoid b
_ a -> b
nv (NonVoid a
x) = a -> b
nv a
x
maybeVoid b
v a -> b
_ MaybeVoid a
Void = b
v