@@ -13,13 +13,9 @@ import qualified AST.Optimized as Opt
1313import qualified AST.Module.Name as ModuleName
1414import qualified Data.Index as Index
1515import qualified Elm.Name as N
16−--import qualified Optimize.Case as Case
17−import qualified Optimize.DecisionTree as DT
16+import qualified Optimize.Case as Case
1817import qualified Optimize.Names as Names
19−--import qualified Optimize.Inline as Inline
20−--import qualified Optimize.Port as Port
2118import qualified Reporting.Annotation as A
22−import qualified Reporting.Region as R
2319
2420
2521
@@ -80,8 +76,7 @@ optimizeExpr (A.At region expression) =
8076 Can.Lambda args body ->
8177 do (argNames, defss) <- destructArgs args
8278 obody <- optimizeExpr body
83− pure $
84− Opt.Function argNames (foldr Opt.Let obody (concat defss))
79+ pure $ Opt.Function argNames (foldr Opt.Let obody (concat defss))
8580
8681 Can.Call func args ->
8782 Opt.Call
@@ -121,7 +116,20 @@ optimizeExpr (A.At region expression) =
121116 Opt.Let (Opt.Def name oexpr) (foldr Opt.Let obody defs)
122117
123118 Can.Case expr branches ->
124− error "TODO"
119+ let
120+ optimizeBranch root (Can.CaseBranch pattern branch) =
121+ do defs <- destructHelp (Opt.VarLocal root) pattern []
122+ obranch <- optimizeExpr branch
123+ pure (pattern, foldr Opt.Let obranch defs)
124+ in
125+ do oexpr <- optimizeExpr expr
126+ case oexpr of
127+ Opt.VarLocal root ->
128+ Case.optimize root <$> traverse (optimizeBranch root) branches
129+
130+ _ ->
131+ do root <- Names.generate
132+ Case.optimize root <$> traverse (optimizeBranch root) branches
125133
126134 Can.Accessor field ->
127135 pure (Opt.Accessor field)
@@ -340,7 +348,20 @@ optimizeTailExpr name argNames locExpr@(A.At _ expression) =
340348 Opt.Let (Opt.Def dname oexpr) (foldr Opt.Let obody defs)
341349
342350 Can.Case expr branches ->
343− error "TODO"
351+ let
352+ optimizeBranch root (Can.CaseBranch pattern branch) =
353+ do defs <- destructHelp (Opt.VarLocal root) pattern []
354+ obranch <- optimizeTailExpr name argNames branch
355+ pure (pattern, foldr Opt.Let obranch defs)
356+ in
357+ do oexpr <- optimizeExpr expr
358+ case oexpr of
359+ Opt.VarLocal root ->
360+ Case.optimize root <$> traverse (optimizeBranch root) branches
361+
362+ _ ->
363+ do root <- Names.generate
364+ Case.optimize root <$> traverse (optimizeBranch root) branches
344365
345366 _ ->
346367 optimizeExpr locExpr
@@ -375,4 +396,3 @@ hasTailCall expression =
375396
376397 _ ->
377398 False
378−