hypertypes-0.2.2: src/Hyper/Unify/Term.hs
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE UndecidableInstances #-}
-- | Unification terms.
--
-- These represent the known state of a unification variable.
module Hyper.Unify.Term
( UTerm (..)
, _UUnbound
, _USkolem
, _UToVar
, _UTerm
, _UInstantiated
, _UResolving
, _UResolved
, _UConverted
, UTermBody (..)
, uBody
, uConstraints
) where
import Hyper
import Hyper.Unify.Constraints (TypeConstraintsOf)
import Hyper.Internal.Prelude
-- | A unification term with a known body
data UTermBody v ast = UTermBody
{ _uConstraints :: TypeConstraintsOf (GetHyperType ast)
, _uBody :: ast :# v
}
deriving (Generic)
-- | A unification term pointed by a unification variable
data UTerm v ast
= -- | Unbound variable with at least the given constraints
UUnbound (TypeConstraintsOf (GetHyperType ast))
| -- | A variable bound by a rigid quantified variable with
-- *exactly* the given constraints
USkolem (TypeConstraintsOf (GetHyperType ast))
| -- | Unified with another variable (union-find)
UToVar (v ast)
| -- | Known type term with unification variables as children
UTerm (UTermBody v ast)
| -- | Temporary state during instantiation indicating which fresh
-- unification variable a skolem is mapped to
UInstantiated (v ast)
| -- | Temporary state while unification term is being traversed,
-- if it occurs inside itself (detected via state still being
-- UResolving), then the type is an infinite type
UResolving (UTermBody v ast)
| -- | Final resolved state. `Hyper.Unify.applyBindings` resolved to
-- this expression (allowing caching/sharing)
UResolved (Pure ast)
| -- | Temporary state used in "Hyper.Unify.Binding.ST.Save" while
-- converting to a pure binding
UConverted Int
deriving (Generic)
makePrisms ''UTerm
makeLenses ''UTermBody
makeCommonInstances [''UTerm, ''UTermBody]