module Control.Isomorphism.Partial.Constructors
( nil
, cons
, listCases
, left
, right
, nothing
, just
) where
import Prelude ()
import Data.Bool (Bool, otherwise)
import Data.Either (Either (Left, Right))
import Data.Eq (Eq ((==)))
import Data.Maybe (Maybe (Just, Nothing))
import Control.Isomorphism.Partial.Unsafe (Iso (Iso))
import Control.Isomorphism.Partial.TH (defineIsomorphisms)
nil :: Iso () [alpha]
nil = Iso f g where
f () = Just []
g [] = Just ()
g _ = Nothing
cons :: Iso (alpha, [alpha]) [alpha]
cons = Iso f g where
f (x, xs) = Just (x : xs)
g (x : xs) = Just (x, xs)
g _ = Nothing
listCases :: Iso (Either () (alpha, [alpha])) [alpha]
listCases = Iso f g
where
f (Left ()) = Just []
f (Right (x, xs)) = Just (x : xs)
g [] = Just (Left ())
g (x:xs) = Just (Right (x, xs))
$(defineIsomorphisms ''Either)
$(defineIsomorphisms ''Maybe)