/compiler/Eta/BasicTypes/NameEnv.hs

https://github.com/typelead/eta · Haskell · 114 lines · 73 code · 13 blank · 28 comment · 0 complexity · 83c994bf0c86718985b0d416b4f19a19 MD5 · raw file

  1. {-
  2. (c) The University of Glasgow 2006
  3. (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
  4. \section[NameEnv]{@NameEnv@: name environments}
  5. -}
  6. {-# LANGUAGE CPP #-}
  7. module Eta.BasicTypes.NameEnv (
  8. -- * Var, Id and TyVar environments (maps)
  9. NameEnv,
  10. -- ** Manipulating these environments
  11. mkNameEnv,
  12. emptyNameEnv, unitNameEnv, nameEnvElts,
  13. extendNameEnv_C, extendNameEnv_Acc, extendNameEnv,
  14. extendNameEnvList, extendNameEnvList_C,
  15. foldNameEnv, filterNameEnv, anyNameEnv,
  16. plusNameEnv, plusNameEnv_C, alterNameEnv,
  17. lookupNameEnv, lookupNameEnv_NF, delFromNameEnv, delListFromNameEnv,
  18. elemNameEnv, mapNameEnv, disjointNameEnv,
  19. -- ** Dependency analysis
  20. depAnal
  21. ) where
  22. #include "HsVersions.h"
  23. import Eta.Utils.Digraph
  24. import Eta.BasicTypes.Name
  25. import Eta.Utils.UniqFM
  26. import Eta.Utils.Maybes
  27. {-
  28. ************************************************************************
  29. * *
  30. \subsection{Name environment}
  31. * *
  32. ************************************************************************
  33. -}
  34. depAnal :: (node -> [Name]) -- Defs
  35. -> (node -> [Name]) -- Uses
  36. -> [node]
  37. -> [SCC node]
  38. -- Peform dependency analysis on a group of definitions,
  39. -- where each definition may define more than one Name
  40. --
  41. -- The get_defs and get_uses functions are called only once per node
  42. depAnal get_defs get_uses nodes
  43. = stronglyConnCompFromEdgedVertices (map mk_node keyed_nodes)
  44. where
  45. keyed_nodes = nodes `zip` [(1::Int)..]
  46. mk_node (node, key) = (node, key, mapMaybe (lookupNameEnv key_map) (get_uses node))
  47. key_map :: NameEnv Int -- Maps a Name to the key of the decl that defines it
  48. key_map = mkNameEnv [(name,key) | (node, key) <- keyed_nodes, name <- get_defs node]
  49. {-
  50. ************************************************************************
  51. * *
  52. \subsection{Name environment}
  53. * *
  54. ************************************************************************
  55. -}
  56. type NameEnv a = UniqFM a -- Domain is Name
  57. emptyNameEnv :: NameEnv a
  58. mkNameEnv :: [(Name,a)] -> NameEnv a
  59. nameEnvElts :: NameEnv a -> [a]
  60. alterNameEnv :: (Maybe a-> Maybe a) -> NameEnv a -> Name -> NameEnv a
  61. extendNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
  62. extendNameEnv_Acc :: (a->b->b) -> (a->b) -> NameEnv b -> Name -> a -> NameEnv b
  63. extendNameEnv :: NameEnv a -> Name -> a -> NameEnv a
  64. plusNameEnv :: NameEnv a -> NameEnv a -> NameEnv a
  65. plusNameEnv_C :: (a->a->a) -> NameEnv a -> NameEnv a -> NameEnv a
  66. extendNameEnvList :: NameEnv a -> [(Name,a)] -> NameEnv a
  67. extendNameEnvList_C :: (a->a->a) -> NameEnv a -> [(Name,a)] -> NameEnv a
  68. delFromNameEnv :: NameEnv a -> Name -> NameEnv a
  69. delListFromNameEnv :: NameEnv a -> [Name] -> NameEnv a
  70. elemNameEnv :: Name -> NameEnv a -> Bool
  71. unitNameEnv :: Name -> a -> NameEnv a
  72. lookupNameEnv :: NameEnv a -> Name -> Maybe a
  73. lookupNameEnv_NF :: NameEnv a -> Name -> a
  74. foldNameEnv :: (a -> b -> b) -> b -> NameEnv a -> b
  75. filterNameEnv :: (elt -> Bool) -> NameEnv elt -> NameEnv elt
  76. anyNameEnv :: (elt -> Bool) -> NameEnv elt -> Bool
  77. mapNameEnv :: (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
  78. disjointNameEnv :: NameEnv a -> NameEnv a -> Bool
  79. nameEnvElts x = eltsUFM x
  80. emptyNameEnv = emptyUFM
  81. unitNameEnv x y = unitUFM x y
  82. extendNameEnv x y z = addToUFM x y z
  83. extendNameEnvList x l = addListToUFM x l
  84. lookupNameEnv x y = lookupUFM x y
  85. alterNameEnv = alterUFM
  86. mkNameEnv l = listToUFM l
  87. elemNameEnv x y = elemUFM x y
  88. foldNameEnv a b c = foldUFM a b c
  89. plusNameEnv x y = plusUFM x y
  90. plusNameEnv_C f x y = plusUFM_C f x y
  91. extendNameEnv_C f x y z = addToUFM_C f x y z
  92. mapNameEnv f x = mapUFM f x
  93. extendNameEnv_Acc x y z a b = addToUFM_Acc x y z a b
  94. extendNameEnvList_C x y z = addListToUFM_C x y z
  95. delFromNameEnv x y = delFromUFM x y
  96. delListFromNameEnv x y = delListFromUFM x y
  97. filterNameEnv x y = filterUFM x y
  98. anyNameEnv f x = foldUFM ((||) . f) False x
  99. disjointNameEnv x y = isNullUFM (intersectUFM x y)
  100. lookupNameEnv_NF env n = expectJust "lookupNameEnv_NF" (lookupNameEnv env n)