summaryrefslogtreecommitdiff
path: root/src/GF/Canon/Share.hs
diff options
context:
space:
mode:
authoraarne <unknown>2005-01-11 15:06:12 +0000
committeraarne <unknown>2005-01-11 15:06:12 +0000
commit87b55df10f00fd23d89a89bfb7c4354ff455d83d (patch)
tree91d46e3592a49de8cf7b6b3917fcc0077df1dbd6 /src/GF/Canon/Share.hs
parentbb3d2e1d42e662a3add785670f289787d2e492e2 (diff)
-val optimization
Diffstat (limited to 'src/GF/Canon/Share.hs')
-rw-r--r--src/GF/Canon/Share.hs9
1 files changed, 8 insertions, 1 deletions
diff --git a/src/GF/Canon/Share.hs b/src/GF/Canon/Share.hs
index 63e12436a..f482505b0 100644
--- a/src/GF/Canon/Share.hs
+++ b/src/GF/Canon/Share.hs
@@ -1,4 +1,4 @@
-module Share (shareModule, OptSpec, basicOpt, fullOpt) where
+module Share (shareModule, OptSpec, basicOpt, fullOpt, valOpt) where
import AbsGFC
import Ident
@@ -13,8 +13,10 @@ import qualified Modules as M
type OptSpec = [Integer] ---
doOptFactor opt = elem 2 opt
+doOptValues opt = elem 3 opt
basicOpt = []
fullOpt = [2]
+valOpt = [3]
shareModule :: OptSpec -> (Ident, CanonModInfo) -> (Ident, CanonModInfo)
shareModule opt (i,m) = case m of
@@ -30,6 +32,7 @@ shareInfo _ i = i
shareOpt :: OptSpec -> Term -> Term
shareOpt opt
| doOptFactor opt = share . factor 0
+ | doOptValues opt = values
| otherwise = share
-- we need no counter to create new variable names, since variables are
@@ -114,3 +117,7 @@ replace old new trm = case trm of
R _ -> True
_ -> False
+values :: Term -> Term
+values t = case t of
+ T ty cs -> V ty [values t | Cas _ t <- cs] -- assumes proper order
+ _ -> C.composSafeOp values t