Skip to content

Commit cae6f37

Browse files
committed
[ cleanup ] Simplify optimiser using mcons
1 parent 97d07c8 commit cae6f37

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

src/Core/Case/Optimise.idr

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import public Core.Case.CaseTree
88

99
import Data.Maybe
1010
import Data.List
11+
import Libraries.Data.List.Extra
1112
import Libraries.Data.List.LengthMatch
1213
import Libraries.Data.List.SizeOf
1314

@@ -61,7 +62,7 @@ optimiseTree : {vars : _} -> List (Var vars, MatchResult vars) -> CaseTree vars
6162

6263
optimiseAlts : {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))
6566
optimiseAlts ps v _ [] = ([], Nothing)
6667
optimiseAlts 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)
7677
optimiseAlts 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)
8384
optimiseAlts 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)
8990
optimiseAlts 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

9293
pickAlt : {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')) =>

src/Libraries/Data/List/Extra.idr

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import public Data.List
44

55
%default total
66

7+
public export
8+
mcons : Maybe a -> List a -> List a
9+
mcons Nothing xs = xs
10+
mcons (Just x) xs = x :: xs
11+
712
||| Fetches the element at a given position.
813
||| Returns `Nothing` if the position beyond the list's end.
914
public export

0 commit comments

Comments
 (0)