@@ -13,13 +13,9 @@ import qualified AST.Optimized as Opt
13import qualified AST.Module.Name as ModuleName
13import qualified AST.Module.Name as ModuleName
14import qualified Data.Index as Index
14import qualified Data.Index as Index
15import qualified Elm.Name as N
15import qualified Elm.Name as N
16−--import qualified Optimize.Case as Case
16+import qualified Optimize.Case as Case
17−import qualified Optimize.DecisionTree as DT
18import qualified Optimize.Names as Names
17import qualified Optimize.Names as Names
19−--import qualified Optimize.Inline as Inline
20−--import qualified Optimize.Port as Port
21import qualified Reporting.Annotation as A
18import qualified Reporting.Annotation as A
22−import qualified Reporting.Region as R
@@ -80,8 +76,7 @@ optimizeExpr (A.At region expression) =
80 Can.Lambda args body ->
76 Can.Lambda args body ->
81 do (argNames, defss) <- destructArgs args
77 do (argNames, defss) <- destructArgs args
82 obody <- optimizeExpr body
78 obody <- optimizeExpr body
84− Opt.Function argNames (foldr Opt.Let obody (concat defss))
79+ pure $ Opt.Function argNames (foldr Opt.Let obody (concat defss))
86 Can.Call func args ->
81 Can.Call func args ->
@@ -121,7 +116,20 @@ optimizeExpr (A.At region expression) =
121 Opt.Let (Opt.Def name oexpr) (foldr Opt.Let obody defs)
116 Opt.Let (Opt.Def name oexpr) (foldr Opt.Let obody defs)
123 Can.Case expr branches ->
118 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)
125+ do oexpr <- optimizeExpr expr
127+ Opt.VarLocal root ->
128+ Case.optimize root <$> traverse (optimizeBranch root) branches
131+ do root <- Names.generate
132+ Case.optimize root <$> traverse (optimizeBranch root) branches
126 Can.Accessor field ->
134 Can.Accessor field ->
127 pure (Opt.Accessor field)
135 pure (Opt.Accessor field)
@@ -340,7 +348,20 @@ optimizeTailExpr name argNames locExpr@(A.At _ expression) =
340 Opt.Let (Opt.Def dname oexpr) (foldr Opt.Let obody defs)
348 Opt.Let (Opt.Def dname oexpr) (foldr Opt.Let obody defs)
342 Can.Case expr branches ->
350 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)
357+ do oexpr <- optimizeExpr expr
359+ Opt.VarLocal root ->
360+ Case.optimize root <$> traverse (optimizeBranch root) branches
363+ do root <- Names.generate
364+ Case.optimize root <$> traverse (optimizeBranch root) branches
346 optimizeExpr locExpr
367 optimizeExpr locExpr
@@ -375,4 +396,3 @@ hasTailCall expression =