invertible-0.1: Data/Invertible/Maybe.hs
-- |
-- Bidirectional version of "Data.Maybe".
{-# LANGUAGE Safe #-}
module Data.Invertible.Maybe
( isJust
, isNothing
, listToMaybe
, maybeToList
, fromMaybe
) where
import qualified Data.Maybe as M
import Data.Invertible.Bijection
import Data.Invertible.TH
import Data.Invertible.Internal
-- |Convert between 'Just ()' and 'True' (see 'M.isJust').
isJust :: Maybe () <-> Bool
isJust =
[biCase|
Just () <-> True
Nothing <-> False
|]
-- |Convert between 'Nothing' and 'True' (see 'M.isNothing'). (@'Data.Invertible.Bool.not' . 'isJust'@)
isNothing :: Maybe () <-> Bool
isNothing =
[biCase|
Nothing <-> True
Just () <-> False
|]
-- |Convert between (the head of) a (singleton) list and 'Maybe' (see 'M.listToMaybe'). (@'Control.Invertible.BiArrow.inv' 'maybeToList'@)
listToMaybe :: [a] <-> Maybe a
listToMaybe = M.listToMaybe :<->: M.maybeToList
-- |Convert between 'Maybe' and a (singleton) list (see 'M.maybeToList'). (@'Control.Invertible.BiArrow.inv' 'listToMaybe'@)
maybeToList :: Maybe a <-> [a]
maybeToList = invert listToMaybe
-- |Convert between 'Nothing' and a default value, or 'Just' and its value (not a true bijection).
fromMaybe :: Eq a => a -> Maybe a <-> a
fromMaybe d = M.fromMaybe d :<->: \a -> if a == d then Nothing else Just a