@@ -9,49 +9,22 @@ import qualified Data.Maybe as Maybe
99import qualified AST.Expression.Optimized as Opt
1010import qualified AST.Pattern as P
1111import qualified Optimize.DecisionTree as DT
12−import qualified Optimize.Environment as Env
13−import qualified Reporting.Annotation as A
14−import qualified Reporting.Region as R
1512
1613
1714
1815-- OPTIMIZE A CASE EXPRESSION
1916
2017
21−optimize
22− :: DT.VariantDict
23− -> R.Region
24− -> String
25− -> [(P.CanonicalPattern, Opt.Expr)]
26− -> Env.Optimizer Opt.Expr
27−optimize variantDict region exprName optBranches =
28− do crashBranches <-
29− mapM (tagCrashBranches region) optBranches
30−
31− let (patterns, indexedBranches) =
32− unzip (zipWith indexify [0..] crashBranches)
33−
34− let decisionTree =
35− DT.compile variantDict patterns
36−
37− return (treeToExpr exprName decisionTree indexedBranches)
38−
39−
40−tagCrashBranches
41− :: R.Region
42− -> (P.CanonicalPattern, Opt.Expr)
43− -> Env.Optimizer (P.CanonicalPattern, Opt.Expr)
44−tagCrashBranches region branch@(pattern@(A.A pr _), expr) =
45− case expr of
46− Opt.Call (Opt.Crash home _ _) [arg] ->
47− do name <- Env.freshName
48− return
49− ( A.A pr (P.Alias name pattern)
50− , Opt.Call (Opt.Crash home region (Just name)) [arg]
51− )
18+optimize :: DT.VariantDict -> String -> [(P.CanonicalPattern, Opt.Expr)] -> Opt.Expr
19+optimize variantDict exprName optBranches =
20+ let
21+ (patterns, indexedBranches) =
22+ unzip (zipWith indexify [0..] optBranches)
5223
53− _ ->
54− return branch
24+ decisionTree =
25+ DT.compile variantDict patterns
26+ in
27+ treeToExpr exprName decisionTree indexedBranches
5528
5629
5730indexify :: Int -> (a,b) -> ((a,Int), (Int,b))
@@ -198,6 +171,3 @@ insertChoices choiceDict decider =
198171 Opt.FanOut path tests fallback ->
199172 Opt.FanOut path (map (second go) tests) (go fallback)
200173
201−
202−
203−