@@ -8,6 +8,7 @@ import public Core.Case.CaseTree
88
99import Data.Maybe
1010import Data.List
11+ import Libraries.Data.List.Extra
1112import Libraries.Data.List.LengthMatch
1213import Libraries.Data.List.SizeOf
1314
@@ -61,7 +62,7 @@ optimiseTree : {vars : _} -> List (Var vars, MatchResult vars) -> CaseTree vars
6162
6263optimiseAlts : {vars : _} -> List (Var vars, MatchResult vars) ->
6364 Var vars -> Maybe UnmatchedPattern -> List (CaseAlt vars) ->
64- (List (Maybe ( CaseAlt vars) ), Maybe (CaseTree vars))
65+ (List (CaseAlt vars), Maybe (CaseTree vars))
6566optimiseAlts ps v _ [] = ([], Nothing )
6667optimiseAlts ps v p (ConCase n tag args sc :: alts)
6768 = do let Just p' = addUnmatchedCon (n, tag) p
@@ -72,22 +73,22 @@ optimiseAlts ps v p (ConCase n tag args sc :: alts)
7273 let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
7374 let ps'' = (v' , Matched $ ConMatched n tag args') :: ps'
7475 let alt = ConCase n tag args <$> optimiseTree ps'' sc
75- mapFst (alt :: ) (optimiseAlts ps v (Just p' ) alts)
76+ mapFst (mcons alt ) (optimiseAlts ps v (Just p' ) alts)
7677optimiseAlts ps v p (DelayCase ty arg sc :: alts)
7778 = do let sz = mkSizeOf [ty, arg]
7879 let v' = weakenNs sz v
7980 let ps' = map (bimap (weakenNs sz) (weakenNs sz)) ps
8081 let ps'' = (v' , Matched $ DelayMatched first (later first)) :: ps'
8182 let alt = DelayCase ty arg <$> optimiseTree ps'' sc
82- mapFst (alt :: ) (optimiseAlts ps v p alts)
83+ mapFst (mcons alt ) (optimiseAlts ps v p alts)
8384optimiseAlts ps v p (ConstCase c sc :: alts)
8485 = do let Just p' = addUnmatchedConst c p
8586 | _ => optimiseAlts ps v p alts -- unreachable case
8687 let ps' = (v, Matched $ ConstMatched c) :: ps
8788 let alt = ConstCase c <$> optimiseTree ps' sc
88- mapFst (alt :: ) (optimiseAlts ps v (Just p') alts)
89+ mapFst (mcons alt ) (optimiseAlts ps v (Just p') alts)
8990optimiseAlts ps v p (DefaultCase sc :: _ )
90- = ([], optimiseTree (maybe ps ( \ p => (v, Unmatched p) :: ps) p ) sc)
91+ = ([], optimiseTree ((v,) . Unmatched <$> p `mcons` ps) sc)
9192
9293pickAlt : {vars : _} -> List (Var vars, MatchResult vars) ->
9394 MatchedPattern vars -> List (CaseAlt vars) -> Maybe (CaseTree vars)
@@ -111,7 +112,7 @@ optimiseTree ps (Case idx el ty alts)
111112 = do let var = MkVar el
112113 case destructMatchResult $ lookup var ps of
113114 Left p => pickAlt ps p alts
114- Right p => case mapFst catMaybes $ optimiseAlts ps var p alts of
115+ Right p => case optimiseAlts ps var p alts of
115116 ([], def) => def
116117 (alts, Nothing ) => Just $ Case idx el ty alts
117118 (alts, Just def@(Case idx' _ _ alts')) =>
0 commit comments