/compiler/GHC/Core/TyCon/Env.hs

https://github.com/bgamari/ghc · Haskell · 145 lines · 97 code · 27 blank · 21 comment · 0 complexity · 14dedd30b7cfa31e70263e41fcd250cf MD5 · raw file

  1. {-
  2. (c) The University of Glasgow 2006
  3. (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
  4. \section[TyConEnv]{@TyConEnv@: tyCon environments}
  5. -}
  6. {-# LANGUAGE ScopedTypeVariables #-}
  7. module GHC.Core.TyCon.Env (
  8. -- * TyCon environment (map)
  9. TyConEnv,
  10. -- ** Manipulating these environments
  11. mkTyConEnv, mkTyConEnvWith,
  12. emptyTyConEnv, isEmptyTyConEnv,
  13. unitTyConEnv, nonDetTyConEnvElts,
  14. extendTyConEnv_C, extendTyConEnv_Acc, extendTyConEnv,
  15. extendTyConEnvList, extendTyConEnvList_C,
  16. filterTyConEnv, anyTyConEnv,
  17. plusTyConEnv, plusTyConEnv_C, plusTyConEnv_CD, plusTyConEnv_CD2, alterTyConEnv,
  18. lookupTyConEnv, lookupTyConEnv_NF, delFromTyConEnv, delListFromTyConEnv,
  19. elemTyConEnv, mapTyConEnv, disjointTyConEnv,
  20. DTyConEnv,
  21. emptyDTyConEnv, isEmptyDTyConEnv,
  22. lookupDTyConEnv,
  23. delFromDTyConEnv, filterDTyConEnv,
  24. mapDTyConEnv, mapMaybeDTyConEnv,
  25. adjustDTyConEnv, alterDTyConEnv, extendDTyConEnv, foldDTyConEnv
  26. ) where
  27. import GHC.Prelude
  28. import GHC.Types.Unique.FM
  29. import GHC.Types.Unique.DFM
  30. import GHC.Core.TyCon (TyCon)
  31. import GHC.Data.Maybe
  32. {-
  33. ************************************************************************
  34. * *
  35. \subsection{TyCon environment}
  36. * *
  37. ************************************************************************
  38. -}
  39. -- | TyCon Environment
  40. type TyConEnv a = UniqFM TyCon a -- Domain is TyCon
  41. emptyTyConEnv :: TyConEnv a
  42. isEmptyTyConEnv :: TyConEnv a -> Bool
  43. mkTyConEnv :: [(TyCon,a)] -> TyConEnv a
  44. mkTyConEnvWith :: (a -> TyCon) -> [a] -> TyConEnv a
  45. nonDetTyConEnvElts :: TyConEnv a -> [a]
  46. alterTyConEnv :: (Maybe a-> Maybe a) -> TyConEnv a -> TyCon -> TyConEnv a
  47. extendTyConEnv_C :: (a->a->a) -> TyConEnv a -> TyCon -> a -> TyConEnv a
  48. extendTyConEnv_Acc :: (a->b->b) -> (a->b) -> TyConEnv b -> TyCon -> a -> TyConEnv b
  49. extendTyConEnv :: TyConEnv a -> TyCon -> a -> TyConEnv a
  50. plusTyConEnv :: TyConEnv a -> TyConEnv a -> TyConEnv a
  51. plusTyConEnv_C :: (a->a->a) -> TyConEnv a -> TyConEnv a -> TyConEnv a
  52. plusTyConEnv_CD :: (a->a->a) -> TyConEnv a -> a -> TyConEnv a -> a -> TyConEnv a
  53. plusTyConEnv_CD2 :: (Maybe a->Maybe a->a) -> TyConEnv a -> TyConEnv a -> TyConEnv a
  54. extendTyConEnvList :: TyConEnv a -> [(TyCon,a)] -> TyConEnv a
  55. extendTyConEnvList_C :: (a->a->a) -> TyConEnv a -> [(TyCon,a)] -> TyConEnv a
  56. delFromTyConEnv :: TyConEnv a -> TyCon -> TyConEnv a
  57. delListFromTyConEnv :: TyConEnv a -> [TyCon] -> TyConEnv a
  58. elemTyConEnv :: TyCon -> TyConEnv a -> Bool
  59. unitTyConEnv :: TyCon -> a -> TyConEnv a
  60. lookupTyConEnv :: TyConEnv a -> TyCon -> Maybe a
  61. lookupTyConEnv_NF :: TyConEnv a -> TyCon -> a
  62. filterTyConEnv :: (elt -> Bool) -> TyConEnv elt -> TyConEnv elt
  63. anyTyConEnv :: (elt -> Bool) -> TyConEnv elt -> Bool
  64. mapTyConEnv :: (elt1 -> elt2) -> TyConEnv elt1 -> TyConEnv elt2
  65. disjointTyConEnv :: TyConEnv a -> TyConEnv a -> Bool
  66. nonDetTyConEnvElts x = nonDetEltsUFM x
  67. emptyTyConEnv = emptyUFM
  68. isEmptyTyConEnv = isNullUFM
  69. unitTyConEnv x y = unitUFM x y
  70. extendTyConEnv x y z = addToUFM x y z
  71. extendTyConEnvList x l = addListToUFM x l
  72. lookupTyConEnv x y = lookupUFM x y
  73. alterTyConEnv = alterUFM
  74. mkTyConEnv l = listToUFM l
  75. mkTyConEnvWith f = mkTyConEnv . map (\a -> (f a, a))
  76. elemTyConEnv x y = elemUFM x y
  77. plusTyConEnv x y = plusUFM x y
  78. plusTyConEnv_C f x y = plusUFM_C f x y
  79. plusTyConEnv_CD f x d y b = plusUFM_CD f x d y b
  80. plusTyConEnv_CD2 f x y = plusUFM_CD2 f x y
  81. extendTyConEnv_C f x y z = addToUFM_C f x y z
  82. mapTyConEnv f x = mapUFM f x
  83. extendTyConEnv_Acc x y z a b = addToUFM_Acc x y z a b
  84. extendTyConEnvList_C x y z = addListToUFM_C x y z
  85. delFromTyConEnv x y = delFromUFM x y
  86. delListFromTyConEnv x y = delListFromUFM x y
  87. filterTyConEnv x y = filterUFM x y
  88. anyTyConEnv f x = foldUFM ((||) . f) False x
  89. disjointTyConEnv x y = disjointUFM x y
  90. lookupTyConEnv_NF env n = expectJust "lookupTyConEnv_NF" (lookupTyConEnv env n)
  91. -- | Deterministic TyCon Environment
  92. --
  93. -- See Note [Deterministic UniqFM] in "GHC.Types.Unique.DFM" for explanation why
  94. -- we need DTyConEnv.
  95. type DTyConEnv a = UniqDFM TyCon a
  96. emptyDTyConEnv :: DTyConEnv a
  97. emptyDTyConEnv = emptyUDFM
  98. isEmptyDTyConEnv :: DTyConEnv a -> Bool
  99. isEmptyDTyConEnv = isNullUDFM
  100. lookupDTyConEnv :: DTyConEnv a -> TyCon -> Maybe a
  101. lookupDTyConEnv = lookupUDFM
  102. delFromDTyConEnv :: DTyConEnv a -> TyCon -> DTyConEnv a
  103. delFromDTyConEnv = delFromUDFM
  104. filterDTyConEnv :: (a -> Bool) -> DTyConEnv a -> DTyConEnv a
  105. filterDTyConEnv = filterUDFM
  106. mapDTyConEnv :: (a -> b) -> DTyConEnv a -> DTyConEnv b
  107. mapDTyConEnv = mapUDFM
  108. mapMaybeDTyConEnv :: (a -> Maybe b) -> DTyConEnv a -> DTyConEnv b
  109. mapMaybeDTyConEnv = mapMaybeUDFM
  110. adjustDTyConEnv :: (a -> a) -> DTyConEnv a -> TyCon -> DTyConEnv a
  111. adjustDTyConEnv = adjustUDFM
  112. alterDTyConEnv :: (Maybe a -> Maybe a) -> DTyConEnv a -> TyCon -> DTyConEnv a
  113. alterDTyConEnv = alterUDFM
  114. extendDTyConEnv :: DTyConEnv a -> TyCon -> a -> DTyConEnv a
  115. extendDTyConEnv = addToUDFM
  116. foldDTyConEnv :: (elt -> a -> a) -> a -> DTyConEnv elt -> a
  117. foldDTyConEnv = foldUDFM