module Maybe where

import List (map);
import ListLive (cons);
import Function (id, ($), (.));
import Prelude ();

data Maybe a = Nothing | Just a;


maybe :: b -> (a -> b) -> Maybe a -> b;
maybe :: forall b a. b -> (a -> b) -> Maybe a -> b
maybe b
x a -> b
_ Maybe a
Nothing = b
x;
maybe b
_ a -> b
f (Just a
a) = a -> b
f a
a;

fromMaybe :: a -> Maybe a -> a;
fromMaybe :: forall a. a -> Maybe a -> a
fromMaybe a
a = a -> (a -> a) -> Maybe a -> a
forall b a. b -> (a -> b) -> Maybe a -> b
maybe a
a a -> a
forall a. a -> a
id;

catMaybes :: [Maybe a] -> [a];
catMaybes :: forall a. [Maybe a] -> [a]
catMaybes [] = [];
catMaybes (Maybe a
mx : [Maybe a]
xs) =
  ([a] -> [a]) -> (a -> [a] -> [a]) -> Maybe a -> [a] -> [a]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [a] -> [a]
forall a. a -> a
id a -> [a] -> [a]
forall a. a -> [a] -> [a]
cons Maybe a
mx ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [Maybe a] -> [a]
forall a. [Maybe a] -> [a]
catMaybes [Maybe a]
xs;

mapMaybe :: (a -> Maybe b) -> [a] -> [b];
mapMaybe :: forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe a -> Maybe b
f = [Maybe b] -> [b]
forall a. [Maybe a] -> [a]
catMaybes ([Maybe b] -> [b]) -> ([a] -> [Maybe b]) -> [a] -> [b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Maybe b) -> [a] -> [Maybe b]
forall a b. (a -> b) -> [a] -> [b]
map a -> Maybe b
f;