module Chiasma.Data.Maybe where

import Control.Monad.Error.Class (MonadError(throwError))

maybeExcept :: MonadError e m => e -> Maybe a -> m a
maybeExcept :: e -> Maybe a -> m a
maybeExcept e
e Maybe a
Nothing = e -> m a
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError e
e
maybeExcept e
_ (Just a
a) = a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
a

findMaybe :: (a -> Maybe b) -> [a] -> Maybe b
findMaybe :: (a -> Maybe b) -> [a] -> Maybe b
findMaybe a -> Maybe b
f [a]
as =
  case (a -> Maybe b) -> [a] -> [b]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe a -> Maybe b
f [a]
as of
    (b
a : [b]
_) -> b -> Maybe b
forall a. a -> Maybe a
Just b
a
    [b]
_ -> Maybe b
forall a. Maybe a
Nothing

orElse :: Maybe a -> Maybe a -> Maybe a
orElse :: Maybe a -> Maybe a -> Maybe a
orElse Maybe a
_ (Just a
a) = a -> Maybe a
forall a. a -> Maybe a
Just a
a
orElse Maybe a
fallback Maybe a
Nothing = Maybe a
fallback