module RemoveListComp where import Substitute import Recursive import HasBaseStruct import BaseSyntax import SrcLoc import HsConstants(mod_PreludeList) import DerivingUtils(alt1,oneDef) import TiNames(ValueId,localVal',topVal) import TiClasses(HasDef) rmAllListComp cm m = mapExp (rmListComp cm) m class RmListComp i s | s->i where rmListComp :: HsIdentI i -> s -> s instance RmListComp i s => RmListComp i [s] where rmListComp = map . rmListComp rmListCompE concatMap e = rmListCompE' rec concatMap e rmListCompE' rec cm e0 = case mapEI id (rmListComp cm) id (rmAllListComp cm) id id e0 of HsListComp stmt -> compileListComp cm stmt e -> rec e
Translation of list comprehensions, as described in section 3.11 of the Haskell 98 report
{- compileListComp :: (ValueId i, HasBaseStruct e (EI i e p ds t c), HasBaseStruct p (PI i p), HasBaseStruct d (DI i e p ds t c tp), HasDef ds d) => HsStmt e p ds -> e -} compileListComp concatMap = comp where comp stmt = case stmt of HsGenerator s p e stmt -> hsLet okDef (hsId concatMap `hsApp` hsEVar ok `hsApp` e) where ok = localVal' "ok" (Just s) -- should be a fresh variable okDef = oneDef (hsFunBind loc0 okEqns) okEqns = [okM p (comp stmt), okM hsPWildCard (hsList [])] okM = alt1 loc0 ok HsQualifier e stmt -> hsIf e (comp stmt) (hsList []) HsLetStmt ds stmt -> hsLet ds (comp stmt) HsLast e -> hsList [e]