{-# LANGUAGE LinearTypes #-} {-# LANGUAGE NoImplicitPrelude #-} -- | This module provides linear functions on the standard 'Maybe' type. module Data.Maybe.Linear ( Maybe (..) , maybe , fromMaybe , maybeToList , catMaybes , mapMaybe ) where import qualified Data.Functor.Linear as Linear import Prelude (Maybe(..)) -- | @maybe b f m@ returns @(f a)@ where @a@ is in -- @m@ if it exists and @b@ otherwise maybe :: b -> (a %1-> b) -> Maybe a %1-> b maybe x _ Nothing = x maybe _ f (Just y) = f y -- | @fromMaybe default m@ is the @a@ in -- @m@ if it exists and the @default@ otherwise fromMaybe :: a -> Maybe a %1-> a fromMaybe a Nothing = a fromMaybe _ (Just a') = a' -- | @maybeToList m@ creates a singleton or an empty list -- based on the @Maybe a@. maybeToList :: Maybe a %1-> [a] maybeToList Nothing = [] maybeToList (Just a) = [a] -- | @catMaybes xs@ discards the @Nothing@s in @xs@ -- and extracts the @a@s catMaybes :: [Maybe a] %1-> [a] catMaybes [] = [] catMaybes (Nothing : xs) = catMaybes xs catMaybes (Just a : xs) = a : catMaybes xs -- | @mapMaybe f xs = catMaybes (map f xs)@ mapMaybe :: (a %1-> Maybe b) -> [a] %1-> [b] mapMaybe f xs = catMaybes (Linear.fmap f xs)