module UHC.Util.Substitutable
(
VarUpdatable(..)
, VarExtractable(..)
, SubstVarKey
, SubstVarVal
, ExtrValVarKey
)
where
import qualified Data.Set as Set
import UHC.Util.VarMp
infixr 6 `varUpd`
infixr 6 `varUpdCyc`
type family SubstVarKey subst :: *
type family SubstVarVal subst :: *
type family ExtrValVarKey vv :: *
type instance ExtrValVarKey [vv] = ExtrValVarKey vv
class VarUpdatable vv subst where
varUpd :: subst -> vv -> vv
varUpdCyc :: subst -> vv -> (vv, VarMp' (SubstVarKey subst) (SubstVarVal subst))
s `varUpdCyc` x = (s `varUpd` x,emptyVarMp)
class Ord (ExtrValVarKey vv) => VarExtractable vv where
varFree :: vv -> [ExtrValVarKey vv]
varFreeSet :: vv -> Set.Set (ExtrValVarKey vv)
varFree = Set.toList . varFreeSet
varFreeSet = Set.fromList . varFree