project-m36-0.2: src/lib/ProjectM36/DataTypes/Either.hs
module ProjectM36.DataTypes.Either where
import ProjectM36.Base
import ProjectM36.AtomFunction
import qualified Data.HashSet as HS
import qualified Data.Map as M
eitherAtomType :: AtomType -> AtomType -> AtomType
eitherAtomType tA tB = ConstructedAtomType "Either" (M.fromList [("a", tA), ("b", tB)])
eitherTypeConstructorMapping :: TypeConstructorMapping
eitherTypeConstructorMapping = [(ADTypeConstructorDef "Either" ["a", "b"],
[DataConstructorDef "Left" [DataConstructorDefTypeVarNameArg "a"],
DataConstructorDef "Right" [DataConstructorDefTypeVarNameArg "b"]])]
eitherAtomFunctions :: AtomFunctions
eitherAtomFunctions = HS.fromList [
compiledAtomFunction "isLeft" [eitherAtomType (TypeVariableType "a") (TypeVariableType "b"), BoolAtomType] $ \(ConstructedAtom dConsName _ _:_) -> pure (BoolAtom (dConsName == "Left"))
]