NameMapsDecorate.hs

module NameMapsDecorate where
import NameMaps
import TiDecorate
import TiTypes
import TiKinds
--import NameMapsBase(bothtype,bothval)
import HsIdent(mapHsIdent2)
import HsDeclMaps(mapFunDeps)
import MapDeclM
import MapDeclMBaseStruct()
import MUtils

instance AccNames i (TiDecls i) where
  accNames f (Decs ds (ks,ts)) = accNames f ds . accNames f ts -- hmm, ks?

instance AccNames i (TiDecl i) where
  accNames f (Dec d) = accNames f d

instance AccNames i (TiExp i) where
  accNames f (Exp e) = accNames f e
  accNames f (TiSpec i _ ts) = accNames f i . accNames f ts
  accNames f (TiTyped e t) = a e . a t
    where a x = accNames f x

instance AccNames i (TiPat i) where
  accNames f (Pat p) = accNames f p
  accNames f (TiPApp p1 p2) = accNames f p1 . accNames f p2
  accNames f (TiPSpec i _ ts) = accNames f i . accNames f ts
  accNames f (TiPTyped p t) = accNames f p . accNames f t

instance AccNames i t => AccNames i (Typing x t) where
  accNames f (x:>:t) = accNames f t -- hmm, x?

instance AccNames i (Scheme i) where
  accNames f (Forall _ _ qt) = accNames f qt

instance AccNames i t => AccNames i (Qual i t) where
  accNames f (ps:=>t) = accNames f ps . accNames f t
--------------------------------------------------------------------------------

instance MapNames i1 (TiDecls i1) i2 (TiDecls i2) where
  mapNames2 c f (Decs ds (ks,ts)) = Decs (m ds) (mks ks,mts c f ts)
    where
      m x = mapNames2 c f x
      mks = map mk
      mk (i:>:(k,ti)) = bothtype mapHsIdent2 f i:>:(k,m ti)

instance MapNames i1 (TiDecl i1) i2 (TiDecl i2) where
  mapNames2 c f (Dec d) = Dec (mapNames2 c f d)

instance MapNames i1 (TiExp i1) i2 (TiExp i2) where
  mapNames2 c f (Exp e) = Exp (mapNames2 c f e)
  mapNames2 c f (TiSpec i sc ts)= TiSpec (bothval mapHsIdent2 f i) (m sc) (m ts)
    where m x = mapNames2 c f x
  mapNames2 c f (TiTyped e t) = TiTyped (m e) (m t)
    where m x = mapNames2 c f x

instance MapNames i1 (TiPat i1) i2 (TiPat i2) where
  mapNames2 c f (Pat p) = Pat (mapNames2 c f p)
  mapNames2 c f (TiPApp p1 p2) = TiPApp (mapNames2 c f p1) (mapNames2 c f p2)
  mapNames2 c f (TiPSpec i sc ts) =
      TiPSpec (bothval mapHsIdent2 f i) (mapNames2 c f sc) (mapNames2 c f ts)
  mapNames2 c f (TiPTyped p t) = TiPTyped (mapNames2 c f p) (mapNames2 c f t)

instance MapNames i1 (Scheme i1) i2 (Scheme i2) where
  mapNames2 c f (Forall as vs qt) =
      Forall (mktvs f as) (mktvs f vs) (mapNames2 c f qt)

mtvs (vf,_) = map (vf (Def Local,ClassOrTypeNames))
mktvs (vf,_) = map (emap (vf (Def Local,ClassOrTypeNames)))

mts c f = map mt
  where mt (i:>:t) = bothval mapHsIdent2 f i:>:mapNames2 c f t

instance MapNames i1 (TypeInfo i1) i2 (TypeInfo i2) where
  mapNames2 c f ti =
      case ti of
        Data -> Data
        Newtype -> Newtype
        Class ps vs fdeps as ->
          Class (m ps) (mktvs f vs) ({-mapFunDeps tvarf-} fdeps) (mts c f as)
        Synonym vs t -> Synonym (mtvs f vs) (m t)
        Tyvar -> Tyvar
    where
      m x = mapNames2 c f x
      tvarf = fst f usetype


instance MapNames i1 t1 i2 t2
      => MapNames i1 (Qual i1 t1) i2 (Qual i2 t2) where
  mapNames2 c f (ps:=>t) = m ps:=>m t
    where m x = mapNames2 c f x

{-
instance MapNames i1 Kind i2 Kind where
  mapNames2 c f k = k
  mapNames f k = k
-}
--------------------------------------------------------------------------------

instance MapDeclM (TiDecls i) (TiDecls i) where
  mapDeclM f (Decs ds dt) = flip Decs dt # mapDeclM f ds

instance MapDeclM (TiDecl i) (TiDecls i) where mapDeclM  = std_mapDeclM

instance MapDeclM (TiExp i) (TiDecls i) where
  mapDeclM f (Exp e) = Exp # mapDeclM f e
  mapDeclM f (TiTyped e t) = flip TiTyped t # mapDeclM f e
  mapDeclM f e@(TiSpec{}) = return e


Plain-text version of NameMapsDecorate.hs | Valid HTML?