HsDeclMaps.hs

-- $Id: HsDeclMaps.hs,v 1.20 2004/01/22 21:21:46 hallgren Exp $

{-

  Maps for the D functor.

-}

module HsDeclMaps where

import HsDeclStruct
--import HsGuardsStruct
import HsGuardsMaps(mapRhs, accRhs, seqRhs)
import AccList(accList)
import HsIdent
import MUtils


mapDI idf = mapDI2 idf idf

mapDI2 :: (i1 -> i2) ->           -- variable identifier recursion function 
          (i1 -> i2) ->           -- constructor identifier recursion function 
          (e1 -> e2) ->           -- expression recursion function
          (p1 -> p2) ->           -- pattern recursion function
          (d1 -> d2) ->           -- declaration recursion function
          (t1 -> t2) ->           -- type recursion function
          (c1 -> c2) ->           -- context recursion function
          (tp1 -> tp2) ->         -- type pattern recursion function
          DI i1 e1 p1 d1 t1 c1 tp1 -> -- old declaration structure
          DI i2 e2 p2 d2 t2 c2 tp2    -- new declaration structure
mapDI2 vf cf ef pf df tf ctxf tpf decl =
  case decl of
    HsTypeDecl s tp t              -> HsTypeDecl s (tpf tp) (tf t)
    HsNewTypeDecl s cntxt tp cd ns -> HsNewTypeDecl s (ctxf cntxt) (tpf tp)
                                     (mapConDeclI2 vf cf tf ctxf cd) (map cf ns)
    HsDataDecl s cntxt tp cds ns   -> HsDataDecl s (ctxf cntxt) (tpf tp)
                              (map (mapConDeclI2 vf cf tf ctxf) cds) (map cf ns)
    HsClassDecl s c tp fundeps ds   -> HsClassDecl s (ctxf c) (tpf tp)
				                (mapFunDeps vf fundeps) (df ds)
    HsInstDecl s optn c tp ds       -> HsInstDecl s (fmap vf optn) (ctxf c)
						  (tf tp) (df ds)
    HsDefaultDecl s t               -> HsDefaultDecl s (map tf t) 
    HsTypeSig s nms c tp            -> HsTypeSig s (map vf nms) (ctxf c) (tf tp)
    HsFunBind s ms                  -> HsFunBind s 
                                            (map (mapMatchI vf ef pf df) ms) 
    HsPatBind s p rhs ds            -> HsPatBind s (pf p) (mapRhs ef rhs)
                                                                    (df ds)
    HsInfixDecl s fixity names      -> HsInfixDecl s fixity (map (mapHsIdent2 vf cf) names)
    
    -- Hugs compatibility
    HsPrimitiveTypeDecl s cntxt tp  -> HsPrimitiveTypeDecl s (ctxf cntxt) (tpf tp)
    HsPrimitiveBind s nm tp         -> HsPrimitiveBind s (vf nm) (tf tp)

mapMatch = mapMatchI id
mapMatchI vf ef pf df (HsMatch s nm ps rhs ds)
    = HsMatch s (vf nm) (map pf ps) (mapRhs ef rhs) (df ds)

mapConDecl = mapConDeclI id
mapConDeclI idf = mapConDeclI2 idf idf
mapConDeclI2 vf cf tf ctxf (HsConDecl s is c nm bangts)
    = HsConDecl s (map vf is) (ctxf c) (cf nm) (map (mapBangType tf) bangts)
mapConDeclI2 vf cf tf ctxf (HsRecDecl s is c nm nmbangts)
    = HsRecDecl s (map vf is) (ctxf c) (cf nm) (map f nmbangts)
  where
    f (n,bt)    = (map vf n, mapBangType tf bt)
 
mapBangType tf (HsBangedType x)   = HsBangedType (tf x)
mapBangType tf (HsUnBangedType x) = HsUnBangedType (tf x)


{-

   Accumulator for the D functor.

-}

accDI ::(i -> b -> b) ->  -- identifier recursion operator
        (e -> b -> b) ->  -- expression recursion operator
        (p -> b -> b) ->  -- pattern recursion operator
        (d -> b -> b) ->  -- declaration recursion operator
        (t -> b -> b) ->  -- type recursion operator
        (c -> b -> b) ->  -- context recursion operator
        (tp -> b -> b) -> -- type pattern recursion operator
	DI i e p d t c tp ->     -- declaration structure
        b ->              -- base case
        b
accDI idf ef pf df tf cf tpf decl =
    case decl of
    HsTypeDecl s tp t                  -> tpf tp . tf t 
    HsNewTypeDecl s cntxt tp cd names  -> cf cntxt . tpf tp 
                                        . accConDeclI idf tf cf cd 
    HsDataDecl s cntxt tp cds names    -> cf cntxt . tpf tp 
                                        . accList (accConDeclI idf tf cf) cds 
    HsClassDecl s c tp fundeps ds       -> cf c . tpf tp
					. accFunDeps idf fundeps . df ds
    HsInstDecl s optn c tp ds           -> maybe id idf optn . cf c . tf tp . df ds
    HsDefaultDecl s t                   -> accList tf t 
    HsTypeSig s nms c tp                -> accList idf nms . cf c . tf tp 
    HsFunBind s ms                      -> accList (accMatchI idf ef pf df) ms
    HsPatBind s p rhs ds                -> pf p . accRhs ef rhs . df ds
    HsInfixDecl s fixity ns             -> accList (accHsIdent idf) ns

    -- Hugs compatibility
    HsPrimitiveTypeDecl s cntxt tp      -> cf cntxt . tpf tp
    HsPrimitiveBind s nm tp             -> idf nm . tf tp

accD = accDI (curry snd)


accMatch = accMatchI (const id)

accMatchI idf ef pf df (HsMatch s nm ps rhs ds) 
    = idf nm . accList pf ps . accRhs ef rhs . df ds

accConDecl = accConDeclI (const id)

accConDeclI idf tf ctxf (HsConDecl s is c nm bangts) 
    = idf nm . accList idf is . ctxf c . accList (accBangType tf) bangts 
accConDeclI idf tf ctxf (HsRecDecl s is c nm nmbangts) 
    = idf nm . accList idf is . ctxf c . accList f nmbangts 
    where
    f (n,bt) = accList idf n . accBangType tf bt
          
accBangType tf (HsBangedType x) ans   = tf x ans
accBangType tf (HsUnBangedType x) ans = tf x ans        



--- in preparation for the D functor monadic trifecta 

seqDI :: (Functor m,Monad m) =>
        -- declaration structure containing computations:
        DI(m i)
          (m e)     --   ... delivering expression recursion
          (m p)     --   ... delivering pattern recursion
          (m d)     --   ... delivering declaration recursion
          (m t)     --   ... delivering type recursion
          (m c)     --   ... delivering context recursion
          (m tp) -> --   ... delivering type pattern recursion
        m (DI i e p d t c tp) -- computation delivering declaration structure
seqDI decl =
    case decl of
    HsTypeDecl s tp t           -> HsTypeDecl s # tp <# t
    HsNewTypeDecl s c tp cd nms ->
        HsNewTypeDecl s # c <# tp <# seqConDecl cd <# sequence nms
    HsDataDecl s c tp cds nms   ->
        HsDataDecl s # c <# tp <# mapM seqConDecl cds <# sequence nms
    HsClassDecl s c tp fundeps ds -> HsClassDecl s # c <# tp <# seqFunDeps fundeps <# ds
    HsInstDecl s optn c tp ds   -> HsInstDecl s # seqMaybe optn <# c <# tp <# ds
    HsDefaultDecl s t            -> HsDefaultDecl s # sequence t
    HsTypeSig s nms c tp         -> HsTypeSig s # sequence nms <# c <# tp
    HsFunBind s ms               -> HsFunBind s # mapM seqMatch ms
    HsPatBind s p rhs ds         -> HsPatBind s # p <# seqRhs rhs <# ds
    HsInfixDecl s fixity names   -> HsInfixDecl s fixity # mapM seqHsIdent names

    HsPrimitiveTypeDecl s c tp   -> HsPrimitiveTypeDecl s # c <# tp
    HsPrimitiveBind s nm tp      -> HsPrimitiveBind s # nm <# tp
            

seqConDecl (HsConDecl sloc is c name bangtypes) = 
  HsConDecl sloc # sequence is <# c <# name <# mapM seqBangType bangtypes
seqConDecl (HsRecDecl sloc is c name fields) = 
  HsRecDecl sloc # sequence is <# c <# name <# mapM (sequence >#< seqBangType) fields

--mapSndM seqBangType fields


seqBangType (HsBangedType t)   = HsBangedType # t
seqBangType (HsUnBangedType t) = HsUnBangedType # t

seqMatch (HsMatch sloc name bs rhs c) = 
  HsMatch sloc # name <# sequence bs <# seqRhs rhs <# c


mapFunDeps = map . mapFunDep
mapFunDep = apBoth . map

accFunDeps = accList . accFunDep

accFunDep tf (ts1,ts2) = accList tf ts1 . accList tf ts2

seqFunDeps fs = mapM seqFunDep fs
seqFunDep fd = sequence>#<sequence $ fd

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