@@ -9,49 +9,22 @@ import qualified Data.Maybe as Maybe
9import qualified AST.Expression.Optimized as Opt
9import qualified AST.Expression.Optimized as Opt
10import qualified AST.Pattern as P
10import qualified AST.Pattern as P
11import qualified Optimize.DecisionTree as DT
11import 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
18-- OPTIMIZE A CASE EXPRESSION
15-- OPTIMIZE A CASE EXPRESSION
25− -> [(P.CanonicalPattern, Opt.Expr)]
18+optimize :: DT.VariantDict -> String -> [(P.CanonicalPattern, Opt.Expr)] -> Opt.Expr
26− -> Env.Optimizer Opt.Expr
27−optimize variantDict region exprName optBranches =
19+optimize variantDict exprName optBranches =
28− do crashBranches <-
20+ let
29− mapM (tagCrashBranches region) optBranches
31− let (patterns, indexedBranches) =
21+ (patterns, indexedBranches) =
32− unzip (zipWith indexify [0..] crashBranches)
22+ unzip (zipWith indexify [0..] optBranches)
35− DT.compile variantDict patterns
37− return (treeToExpr exprName decisionTree indexedBranches)
42− -> (P.CanonicalPattern, Opt.Expr)
43− -> Env.Optimizer (P.CanonicalPattern, Opt.Expr)
44−tagCrashBranches region branch@(pattern@(A.A pr _), expr) =
46− Opt.Call (Opt.Crash home _ _) [arg] ->
47− do name <- Env.freshName
49− ( A.A pr (P.Alias name pattern)
50− , Opt.Call (Opt.Crash home region (Just name)) [arg]
53− _ ->
24+ decisionTree =
54− return branch
25+ DT.compile variantDict patterns
27+ treeToExpr exprName decisionTree indexedBranches
57indexify :: Int -> (a,b) -> ((a,Int), (Int,b))
30indexify :: Int -> (a,b) -> ((a,Int), (Int,b))
@@ -198,6 +171,3 @@ insertChoices choiceDict decider =
198 Opt.FanOut path tests fallback ->
171 Opt.FanOut path tests fallback ->
199 Opt.FanOut path (map (second go) tests) (go fallback)
172 Opt.FanOut path (map (second go) tests) (go fallback)