@DsMonad@: monadery used in desugaring
\begin{code}
-{-# OPTIONS -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
--- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
--- for details
-
module DsMonad (
DsM, mapM, mapAndUnzipM,
- initDs, initDsTc, fixDs, mapAndUnzipM,
+ initDs, initDsTc, fixDs,
foldlM, foldrM, ifOptM,
Applicative(..),(<$>),
eqn_rhs :: MatchResult } -- What to do after match
type DsWrapper = CoreExpr -> CoreExpr
+idDsWrapper :: DsWrapper
idDsWrapper e = e
-- The semantics of (match vs (EqnInfo wrap pats rhs)) is the MatchResult
data CanItFail = CanFail | CantFail
+orFail :: CanItFail -> CanItFail -> CanItFail
orFail CantFail CantFail = CantFail
-orFail _ _ = CanFail
+orFail _ _ = CanFail
\end{code}
type DsM result = TcRnIf DsGblEnv DsLclEnv result
-- Compatibility functions
+fixDs :: (a -> DsM a) -> DsM a
fixDs = fixM
type DsWarning = (SrcSpan, SDoc)
mkDsEnvs :: DynFlags -> Module -> GlobalRdrEnv -> TypeEnv -> IORef Messages -> IO (DsGblEnv, DsLclEnv)
mkDsEnvs dflags mod rdr_env type_env msg_var
- = do
- sites_var <- newIORef []
+ = do -- TODO: unnecessarily monadic
let if_genv = IfGblEnv { if_rec_types = Just (mod, return type_env) }
if_lenv = mkIfLclEnv mod (ptext SLIT("GHC error in desugarer lookup in") <+> ppr mod)
gbl_env = DsGblEnv { ds_mod = mod,
uniq <- newUnique
return (mkSysLocal FSLIT("ds") uniq ty)
+newSysLocalsDs :: [Type] -> DsM [Id]
newSysLocalsDs tys = mapM newSysLocalDs tys
newFailLocalDs ty = do