Some definitions to support type annotations and the dictionary translation for base language declarations (the D structure).
module TiDinst where
import Maybe(isJust)
import HsDeclStruct
import HsDeclMaps(mapDI)
import HsGuardsStruct(HsRhs(..))
import HasBaseStruct
import SubstituteBaseStruct
import Substitute
import TI hiding (Subst)
import TiDkc(Dinst)
import MUtils(( # ))
instance (Types i e,Types i p,Types i ds)
=> Types i (Dinst i e p ds) where
tmap f = mapDI id (tmap f) (tmap f) (tmap f) f (map f) id
instance (HasId i p,HasCoreSyntax i p) => HasAbstr i (Dinst i e p ds) where
abstract [] d = d
abstract xs d =
case d of
HsFunBind s matches -> HsFunBind s (abstract xs matches)
HsPatBind s p rhs ds ->
case isVar p of
Just x -> HsFunBind s [abstract xs (HsMatch s x [] rhs ds)]
_ -> error (show s++": Bug in TiD.hs: tried to overload a pattern binding.")
_ -> d
-- HsPrimitiveTypeDecl s cntxt nm ->
-- HsPrimitiveBind s nm t ->
instance (HasBaseStruct d (Dinst i e p ds),HasCoreSyntax i p,HasDef ds d,
Eq i,FreeNames i e,FreeNames i ds,FreeNames i p,
HasId i e,MapExp e ds,Subst i e,
AddDeclsType i ds)
=> HasLocalDef i e (Dinst i e p ds) where
letvar x@(i:>:_) e d =
case d of
HsFunBind s matches -> HsFunBind s (letvar x e matches)
HsPatBind s p rhs ds ->
if in_p || HsVar i `elem` freeVars (rhs,ds)
then if in_p || not is_id
then -- No substitution in patterns yet (for overloaded literals)
HsPatBind s p rhs (appendDef (letvarD s x e) ds)
else esubst1 var e i d
else d
where
in_p = HsVar i `elem` freeVars p
is_id = isJust (isId e)
_ -> d -- !!
instance HasCoreSyntax i p => HasAbstr i (HsMatchI i e p ds) where
abstract xs (HsMatch s n ps rhs ds) = HsMatch s n (map var xs++ps) rhs ds
instance (HasBaseStruct d (Dinst i e p ds),HasCoreSyntax i p,HasDef ds d,
Eq i,FreeNames i e,FreeNames i ds,FreeNames i p,
HasId i e,MapExp e ds,Subst i e,
AddDeclsType i ds)
=> HasLocalDef i e (HsMatchI i e p ds) where
letvar x@(i:>:_) e m@(HsMatch s n ps rhs ds) =
if in_p || HsVar i `elem` freeVars (rhs,ds)
then if in_p || not is_id
then m' -- No substitution in patterns yet (for overloaded literals)
else esubst1 var e i m
else m
where
m' = HsMatch s n ps rhs (appendDef (letvarD s x e) ds)
in_p = HsVar i `elem` freeVars ps
is_id = isJust (isId e)
letvarD s (x:>:t) e = addDeclsType ([],[HsVar x:>:mono t]) $
oneDef (hsSimpleBind s x e)
hsSimpleBind s x e = hsSimpleBind' s x e noDef
hsSimpleBind' s x e = hsPatBind s (var x) (HsBody e)