hypertypes-0.2.2: src/Hyper/Unify/Constraints.hs
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TemplateHaskell #-}
-- | A class for constraints for unification variables
module Hyper.Unify.Constraints
( TypeConstraints (..)
, HasTypeConstraints (..)
, WithConstraint (..)
, wcConstraint
, wcBody
) where
import Algebra.PartialOrd (PartialOrd (..))
import Data.Kind (Type)
import Hyper (GetHyperType, HyperType, type (#))
import Hyper.Internal.Prelude
-- | A class for constraints for unification variables.
class (PartialOrd c, Monoid c) => TypeConstraints c where
-- | Remove scope constraints.
--
-- When generalizing unification variables into universally
-- quantified variables, and then into fresh unification variables
-- upon instantiation, some constraints need to be carried over,
-- and the "scope" constraints need to be erased.
generalizeConstraints :: c -> c
-- | Remove all constraints other than the scope constraints
--
-- Useful for comparing constraints to the current scope constraints
toScopeConstraints :: c -> c
-- | A class for terms that have constraints.
--
-- A dependency of `Hyper.Class.Unify.Unify`
class
TypeConstraints (TypeConstraintsOf ast) =>
HasTypeConstraints (ast :: HyperType)
where
type TypeConstraintsOf (ast :: HyperType) :: Type
-- | Verify constraints on the ast and apply the given child
-- verifier on children
verifyConstraints ::
TypeConstraintsOf ast ->
ast # h ->
Maybe (ast # WithConstraint h)
-- | A 'HyperType' to represent a term alongside a constraint.
--
-- Used for 'verifyConstraints'.
data WithConstraint h ast = WithConstraint
{ _wcConstraint :: TypeConstraintsOf (GetHyperType ast)
, _wcBody :: h ast
}
makeLenses ''WithConstraint