summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbringert <unknown>2005-11-11 15:38:00 +0000
committerbringert <unknown>2005-11-11 15:38:00 +0000
commitc52e57411b79b543f626651783a5cf2306c916f7 (patch)
tree8a6983dc7087c41fbfadea38a3a7c38fa9fe8ee6 /src
parent1c4c17f1b6db61b7c32083dca4233118efcf68c2 (diff)
Made mapAssignM more efficient.
Diffstat (limited to 'src')
-rw-r--r--src/GF/Grammar/Macros.hs18
1 files changed, 6 insertions, 12 deletions
diff --git a/src/GF/Grammar/Macros.hs b/src/GF/Grammar/Macros.hs
index 6f0ee3335..440a54562 100644
--- a/src/GF/Grammar/Macros.hs
+++ b/src/GF/Grammar/Macros.hs
@@ -5,9 +5,9 @@
-- Stability : (stable)
-- Portability : (portable)
--
--- > CVS $Date: 2005/10/02 20:50:19 $
--- > CVS $Author: aarne $
--- > CVS $Revision: 1.23 $
+-- > CVS $Date: 2005/11/11 16:38:00 $
+-- > CVS $Author: bringert $
+-- > CVS $Revision: 1.24 $
--
-- Macros for constructing and analysing source code terms.
--
@@ -24,7 +24,7 @@ import GF.Grammar.Grammar
import GF.Infra.Ident
import GF.Grammar.PrGrammar
-import Control.Monad (liftM)
+import Control.Monad (liftM, liftM2)
import Data.Char (isDigit)
firstTypeForm :: Type -> Err (Context, Type)
@@ -259,14 +259,8 @@ prLabel :: Label -> String
prLabel = prt
mapAssignM :: Monad m => (Term -> m c) -> [Assign] -> m [(Label,(Maybe c,c))]
-mapAssignM f ltvs = do
- let (ls,tvs) = unzip ltvs
- (ts, vs) = unzip tvs
- ts' <- mapM (\t -> case t of
- Nothing -> return Nothing
- Just y -> f y >>= return . Just) ts
- vs' <- mapM f vs
- return (zip ls (zip ts' vs'))
+mapAssignM f = mapM (\ (ls,tv) -> liftM ((,) ls) (g tv))
+ where g (t,v) = liftM2 (,) (maybe (return Nothing) (liftM Just . f) t) (f v)
mkRecordN :: Int -> (Int -> Label) -> [Term] -> Term
mkRecordN int lab typs = R [ assign (lab i) t | (i,t) <- zip [int..] typs]