hypertypes-0.1.0.1: src/Hyper/Unify/Term.hs
-- | Unification terms.
--
-- These represent the known state of a unification variable.
{-# LANGUAGE TemplateHaskell, UndecidableInstances #-}
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
= UUnbound (TypeConstraintsOf (GetHyperType ast))
-- ^ Unbound variable with at least the given constraints
| USkolem (TypeConstraintsOf (GetHyperType ast))
-- ^ A variable bound by a rigid quantified variable with
-- *exactly* the given constraints
| UToVar (v ast)
-- ^ Unified with another variable (union-find)
| UTerm (UTermBody v ast)
-- ^ Known type term with unification variables as children
| UInstantiated (v ast)
-- ^ Temporary state during instantiation indicating which fresh
-- unification variable a skolem is mapped to
| UResolving (UTermBody 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
| UResolved (Pure ast)
-- ^ Final resolved state. `Hyper.Unify.applyBindings` resolved to
-- this expression (allowing caching/sharing)
| UConverted Int
-- ^ Temporary state used in "Hyper.Unify.Binding.ST.Save" while
-- converting to a pure binding
deriving Generic
makePrisms ''UTerm
makeLenses ''UTermBody
makeCommonInstances [''UTerm, ''UTermBody]