summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Command
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler/GF/Command')
-rw-r--r--src/compiler/GF/Command/TreeOperations.hs13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/compiler/GF/Command/TreeOperations.hs b/src/compiler/GF/Command/TreeOperations.hs
index b9ec7f538..330c82593 100644
--- a/src/compiler/GF/Command/TreeOperations.hs
+++ b/src/compiler/GF/Command/TreeOperations.hs
@@ -20,10 +20,17 @@ allTreeOps pgf = [
Right $ \f -> map (transfer pgf f))),
("paraphrase",("paraphrase by using semantic definitions (def)",
Left $ nub . concatMap (paraphrase pgf))),
+ ("largest",("sort trees from largest to smallest, in number of nodes",
+ Left $ largest)),
("smallest",("sort trees from smallest to largest, in number of nodes",
- Left $ smallest))
+ Left $ smallest)),
+ ("subtrees",("return all fully applied subtrees (stopping at abstractions), by default sorted from the largest",
+ Left $ concatMap subtrees))
]
+largest :: [Expr] -> [Expr]
+largest = reverse . smallest
+
smallest :: [Expr] -> [Expr]
smallest = sortBy (\t u -> compare (size t) (size u)) where
size t = case t of
@@ -31,6 +38,10 @@ smallest = sortBy (\t u -> compare (size t) (size u)) where
EApp e1 e2 -> size e1 + size e2 + 1
_ -> 1
+subtrees :: Expr -> [Expr]
+subtrees t = t : case unApp t of
+ Just (f,ts) -> concatMap subtrees ts
+ _ -> [] -- don't go under abstractions
--- simple-minded transfer; should use PGF.Expr.match