module Base.KindSubst
( module Base.KindSubst, idSubst, singleSubst, bindSubst, compose
) where
import Base.Kinds
import Base.Subst
import Base.TopEnv
import Env.TypeConstructor
type KindSubst = Subst Int Kind
class SubstKind a where
subst :: KindSubst -> a -> a
bindVar :: Int -> Kind -> KindSubst -> KindSubst
bindVar kv k = compose (bindSubst kv k idSubst)
substVar :: KindSubst -> Int -> Kind
substVar = substVar' KindVariable subst
instance SubstKind Kind where
subst _ KindStar = KindStar
subst sigma (KindVariable kv) = substVar sigma kv
subst sigma (KindArrow k1 k2) = KindArrow (subst sigma k1) (subst sigma k2)
instance SubstKind TypeInfo where
subst theta (DataType tc k cs) = DataType tc (subst theta k) cs
subst theta (RenamingType tc k nc) = RenamingType tc (subst theta k) nc
subst theta (AliasType tc k n ty) = AliasType tc (subst theta k) n ty
subst theta (TypeClass cls k ms) = TypeClass cls (subst theta k) ms
subst theta (TypeVar k) = TypeVar (subst theta k)
instance SubstKind a => SubstKind (TopEnv a) where
subst = fmap . subst