summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2011-09-07 17:11:52 +0000
committerhallgren <hallgren@chalmers.se>2011-09-07 17:11:52 +0000
commit8098f79941b9d252eb285217e381c77bed7d70e8 (patch)
tree3a4712aa904cf24b5aa64d08457665fe08ab7ed9
parente223d3bdb9ee9ef4b183c13dfcd295da00353ef9 (diff)
GF.Grammar.Macros: simplify composOp and composSafeOp
-rw-r--r--src/compiler/GF/Grammar/Macros.hs114
1 files changed, 26 insertions, 88 deletions
diff --git a/src/compiler/GF/Grammar/Macros.hs b/src/compiler/GF/Grammar/Macros.hs
index bc7dfe3af..3d8893b99 100644
--- a/src/compiler/GF/Grammar/Macros.hs
+++ b/src/compiler/GF/Grammar/Macros.hs
@@ -27,7 +27,9 @@ import GF.Grammar.Values
import GF.Grammar.Predef
import GF.Grammar.Printer
-import Control.Monad (liftM, liftM2)
+import Control.Monad.Identity(Identity(..))
+import qualified Data.Traversable as T(mapM)
+import Control.Monad (liftM, liftM2, liftM3)
import Data.Char (isDigit)
import Data.List (sortBy,nub)
import Text.PrettyPrint
@@ -453,98 +455,34 @@ stringFromTerm = err id (ifNull "" (sstr . head)) . strsFromTerm
-- | to define compositional term functions
composSafeOp :: (Term -> Term) -> Term -> Term
-composSafeOp op trm = case composOp (mkMonadic op) trm of
- Ok t -> t
- _ -> error "the operation is safe isn't it ?"
- where
- mkMonadic f = return . f
+composSafeOp op = runIdentity . composOp (return . op)
-- | to define compositional term functions
composOp :: Monad m => (Term -> m Term) -> Term -> m Term
composOp co trm =
case trm of
- App c a ->
- do c' <- co c
- a' <- co a
- return (App c' a')
- Abs b x t ->
- do t' <- co t
- return (Abs b x t')
- Prod b x a t ->
- do a' <- co a
- t' <- co t
- return (Prod b x a' t')
- S c a ->
- do c' <- co c
- a' <- co a
- return (S c' a')
- Table a c ->
- do a' <- co a
- c' <- co c
- return (Table a' c')
- R r ->
- do r' <- mapAssignM co r
- return (R r')
- RecType r ->
- do r' <- mapPairListM (co . snd) r
- return (RecType r')
- P t i ->
- do t' <- co t
- return (P t' i)
- ExtR a c ->
- do a' <- co a
- c' <- co c
- return (ExtR a' c')
-
- T i cc ->
- do cc' <- mapPairListM (co . snd) cc
- i' <- changeTableType co i
- return (T i' cc')
-
- V ty vs ->
- do ty' <- co ty
- vs' <- mapM co vs
- return (V ty' vs')
-
- Let (x,(mt,a)) b ->
- do a' <- co a
- mt' <- case mt of
- Just t -> co t >>= (return . Just)
- _ -> return mt
- b' <- co b
- return (Let (x,(mt',a')) b')
-
- C s1 s2 ->
- do v1 <- co s1
- v2 <- co s2
- return (C v1 v2)
- Glue s1 s2 ->
- do v1 <- co s1
- v2 <- co s2
- return (Glue v1 v2)
- Alts t aa ->
- do t' <- co t
- aa' <- mapM (pairM co) aa
- return (Alts t' aa')
- FV ts -> mapM co ts >>= return . FV
- Strs tt -> mapM co tt >>= return . Strs
-
- EPattType ty ->
- do ty' <- co ty
- return (EPattType ty')
-
- ELincat c ty ->
- do ty' <- co ty
- return (ELincat c ty')
-
- ELin c ty ->
- do ty' <- co ty
- return (ELin c ty')
-
- ImplArg t ->
- do t' <- co t
- return (ImplArg t')
-
+ App c a -> liftM2 App (co c) (co a)
+ Abs b x t -> liftM (Abs b x) (co t)
+ Prod b x a t -> liftM2 (Prod b x) (co a) (co t)
+ S c a -> liftM2 S (co c) (co a)
+ Table a c -> liftM2 Table (co a) (co c)
+ R r -> liftM R (mapAssignM co r)
+ RecType r -> liftM RecType (mapPairsM co r)
+ P t i -> liftM2 P (co t) (return i)
+ ExtR a c -> liftM2 ExtR (co a) (co c)
+ T i cc -> liftM2 (flip T) (mapPairsM co cc) (changeTableType co i)
+ V ty vs -> liftM2 V (co ty) (mapM co vs)
+ Let (x,(mt,a)) b -> liftM3 let' (co a) (T.mapM co mt) (co b)
+ where let' a' mt' b' = Let (x,(mt',a')) b'
+ C s1 s2 -> liftM2 C (co s1) (co s2)
+ Glue s1 s2 -> liftM2 Glue (co s1) (co s2)
+ Alts t aa -> liftM2 Alts (co t) (mapM (pairM co) aa)
+ FV ts -> liftM FV (mapM co ts)
+ Strs tt -> liftM Strs (mapM co tt)
+ EPattType ty -> liftM EPattType (co ty)
+ ELincat c ty -> liftM (ELincat c) (co ty)
+ ELin c ty -> liftM (ELin c) (co ty)
+ ImplArg t -> liftM ImplArg (co t)
_ -> return trm -- covers K, Vr, Cn, Sort, EPatt
getTableType :: TInfo -> Err Type