Skip to content

Commit a0e5246

Browse files
committed
ScopedSnocList: WIP: trivial constructor substitutions
1 parent 901e591 commit a0e5246

40 files changed

+330
-290
lines changed

src/Core/Case/CaseBuilder.idr

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import Data.String
1919
import Data.Vect
2020
import Libraries.Data.List.LengthMatch
2121
import Libraries.Data.SortedSet
22+
import Libraries.Data.SnocList.SizeOf
23+
import Libraries.Data.SnocList.LengthMatch
2224

2325
import Decidable.Equality
2426

@@ -476,8 +478,8 @@ nextNames {vars} fc root (pats :< p) fty
476478
newPats : (pargs : SnocList Pat) -> LengthMatch pargs ns ->
477479
NamedPats vars (todo ++ ns) ->
478480
NamedPats vars ns
479-
newPats [<] NilMatch rest = []
480-
newPats (xs :< newpat) (ConsMatch w) (pi :: rest)
481+
newPats [<] LinMatch rest = []
482+
newPats (xs :< newpat) (SnocMatch w) (pi :: rest)
481483
= { pat := newpat} pi :: newPats xs w rest
482484

483485
updateNames : SnocList (Name, Pat) -> SnocList (Name, Name)
@@ -600,7 +602,7 @@ groupCons fc fn pvars cs
600602
((DelayGroup {tyarg} {valarg} ((MkPatClause pvars ps tid tm) :: rest)) :: gs)
601603
| (DelayMatch {tyarg} {valarg})
602604
= do let l = mkSizeOf [<valarg, tyarg]
603-
let newps = newPats [<parg, pty] (ConsMatch (ConsMatch NilMatch)) ps
605+
let newps = newPats [<parg, pty] (SnocMatch (SnocMatch LinMatch)) ps
604606
let pats' = updatePatNames (updateNames [<(valarg, parg), (tyarg, pty)])
605607
(weakenNs l pats)
606608
let newclause : PatClause (vars' :< valarg :< tyarg)
@@ -685,10 +687,10 @@ data ScoredPats : SnocList Name -> SnocList Name -> Type where
685687
zeroedScore : {ps : _} -> List (NamedPats ns (ps :< p)) -> ScoredPats ns (ps :< p)
686688
zeroedScore nps = Scored nps (replicate (S $ length ps) 0)
687689

688-
||| Proof that a value `v` inserted in the middle of a list with
689-
||| prefix `ps` and suffix `qs` can equivalently be snoced with
690+
||| Proof that a value `v` inserted in the middle of a snoc list with
691+
||| prefix `ps` and suffix `qs` can equivalently be consed with
690692
||| `ps` or consed with `qs` before appending `qs` to `ps`.
691-
elemInsertedMiddle : (v : a) -> (ps,qs : SnocList a) -> ((qs :< v) ++ ps) = (qs ++ (ps `snoc` v))
693+
elemInsertedMiddle : (v : a) -> (ps,qs : SnocList a) -> ((qs :< v) ++ ps) = (qs ++ (v `cons` ps))
692694
elemInsertedMiddle v [<] qs = Refl
693695
elemInsertedMiddle v (xs :< x) qs = rewrite elemInsertedMiddle v xs qs in Refl
694696

@@ -704,7 +706,7 @@ highScore : {prev : SnocList Name} ->
704706
highScore [<] [] high idx True = Nothing
705707
highScore [<] [] high idx False = Just idx
706708
highScore (xs :< x) (y :: ys) high idx duped =
707-
let next = highScore {prev = prev `snoc` x} xs ys
709+
let next = highScore {prev = x `cons` prev} xs ys
708710
prf = elemInsertedMiddle x prev xs
709711
in rewrite prf in
710712
case compare y high of
@@ -1097,7 +1099,7 @@ mkPat args orig (Ref fc (DataCon t a) n) = pure $ PCon fc n t a args
10971099
mkPat args orig (Ref fc (TyCon t a) n) = pure $ PTyCon fc n a args
10981100
mkPat args orig (Ref fc Func n)
10991101
= do prims <- getPrimitiveNames
1100-
mtm <- normalisePrims (const True) isPConst True prims n args orig []
1102+
mtm <- normalisePrims (const True) isPConst True prims n args orig [<]
11011103
case mtm of
11021104
Just tm => if tm /= orig -- check we made progress; if there's an
11031105
-- unresolved interface, we might be stuck
@@ -1146,34 +1148,34 @@ mkPatClause fc fn args ty pid (ps, rhs)
11461148
= maybe (throw (CaseCompile fc fn DifferingArgNumbers))
11471149
(\eq =>
11481150
do defs <- get Ctxt
1149-
nty <- nf defs [] ty
1151+
nty <- nf defs [<] ty
11501152
ns <- mkNames args ps eq (Just nty)
11511153
log "compile.casetree" 20 $
11521154
"Make pat clause for names " ++ show ns
11531155
++ " in LHS " ++ show ps
11541156
pure (MkPatClause [] ns pid
1155-
(rewrite sym (appendNilRightNeutral args) in
1157+
(rewrite sym (appendLinLeftNeutral args) in
11561158
(weakenNs (mkSizeOf args) rhs))))
11571159
(checkLengthMatch args ps)
11581160
where
11591161
mkNames : (vars : SnocList Name) -> (ps : SnocList Pat) ->
11601162
LengthMatch vars ps -> Maybe (NF [<]) ->
11611163
Core (NamedPats vars vars)
1162-
mkNames [<] [<] NilMatch fty = pure []
1163-
mkNames (args :< arg) (ps :< p) (ConsMatch eq) fty
1164+
mkNames [<] [<] LinMatch fty = pure []
1165+
mkNames (args :< arg) (ps :< p) (SnocMatch eq) fty
11641166
= do defs <- get Ctxt
11651167
empty <- clearDefs defs
11661168
fa_tys <- the (Core (Maybe _, ArgType _)) $
11671169
case fty of
11681170
Nothing => pure (Nothing, CaseBuilder.Unknown)
11691171
Just (NBind pfc _ (Pi _ c _ farg) fsc) =>
1170-
pure (Just !(fsc defs (toClosure defaultOpts [] (Ref pfc Bound arg))),
1172+
pure (Just !(fsc defs (toClosure defaultOpts [<] (Ref pfc Bound arg))),
11711173
Known c (embed {outer = args :< arg}
1172-
!(quote empty [] farg)))
1174+
!(quote empty [<] farg)))
11731175
Just t =>
11741176
pure (Nothing,
11751177
Stuck (embed {outer = args :< arg}
1176-
!(quote empty [] t)))
1178+
!(quote empty [<] t)))
11771179
pure (MkInfo p First (Builtin.snd fa_tys)
11781180
:: weaken !(mkNames args ps eq (Builtin.fst fa_tys)))
11791181

@@ -1199,7 +1201,7 @@ patCompile fc fn phase ty (p :: ps) def
11991201
log "compile.casetree" 10 $ show pats
12001202
i <- newRef PName (the Int 0)
12011203
cases <- match fc fn phase pats
1202-
(rewrite sym (appendNilRightNeutral ns) in
1204+
(rewrite sym (appendLinLeftNeutral ns) in
12031205
map (weakenNs n) def)
12041206
pure (_ ** cases)
12051207
where
@@ -1216,7 +1218,7 @@ patCompile fc fn phase ty (p :: ps) def
12161218
getNames i [<] = ([<] ** zero)
12171219
getNames i (xs :< x) =
12181220
let (ns ** n) = getNames (i + 1) xs
1219-
in (MN "arg" ns :< i ** suc n)
1221+
in (ns :< MN "arg" i ** suc n)
12201222

12211223
toPatClause : {auto c : Ref Ctxt Defs} ->
12221224
FC -> Name -> (ClosedTerm, ClosedTerm) ->
@@ -1346,12 +1348,12 @@ getPMDef : {auto c : Ref Ctxt Defs} ->
13461348
getPMDef fc phase fn ty []
13471349
= do log "compile.casetree.getpmdef" 20 "getPMDef: No clauses!"
13481350
defs <- get Ctxt
1349-
pure (!(getArgs 0 !(nf defs [] ty)) ** (Unmatched "No clauses", []))
1351+
pure (!(getArgs 0 !(nf defs [<] ty)) ** (Unmatched "No clauses", []))
13501352
where
13511353
getArgs : Int -> NF [<] -> Core (SnocList Name)
13521354
getArgs i (NBind fc x (Pi _ _ _ _) sc)
13531355
= do defs <- get Ctxt
1354-
sc' <- sc defs (toClosure defaultOpts [] (Erased fc Placeholder))
1356+
sc' <- sc defs (toClosure defaultOpts [<] (Erased fc Placeholder))
13551357
pure (!(getArgs i sc') :< MN "arg" i)
13561358
getArgs i _ = pure [<]
13571359
getPMDef fc phase fn ty clauses

src/Core/Coverage.idr

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import Data.String
1515

1616
import Libraries.Data.NameMap
1717
import Libraries.Data.String.Extra
18+
import Libraries.Data.SnocList.SizeOf
1819
import Libraries.Text.PrettyPrint.Prettyprinter
1920

2021
%default covering
@@ -77,7 +78,7 @@ conflict defs env nfty n
7778
| Nothing => pure False
7879
case (definition gdef, type gdef) of
7980
(DCon t arity _, dty)
80-
=> do Nothing <- conflictNF 0 nfty !(nf defs [] dty)
81+
=> do Nothing <- conflictNF 0 nfty !(nf defs [<] dty)
8182
| Just ms => pure $ conflictMatch ms
8283
pure True
8384
_ => pure False
@@ -110,7 +111,7 @@ conflict defs env nfty n
110111
-- put posslbe
111112
= let x' = MN (show x) i in
112113
conflictNF (i + 1) t
113-
!(sc defs (toClosure defaultOpts [] (Ref fc Bound x')))
114+
!(sc defs (toClosure defaultOpts [<] (Ref fc Bound x')))
114115
conflictNF i nf (NApp _ (NRef Bound n) [<])
115116
= do empty <- clearDefs defs
116117
pure (Just [(n, !(quote empty env nf))])
@@ -455,7 +456,7 @@ checkMatched cs ulhs
455456
where
456457
tryClauses : List Clause -> ClosedTerm -> Core (Maybe ClosedTerm)
457458
tryClauses [] ulhs
458-
= do logTermNF "coverage" 10 "Nothing matches" [] ulhs
459+
= do logTermNF "coverage" 10 "Nothing matches" [<] ulhs
459460
pure $ Just ulhs
460461
tryClauses (MkClause env lhs _ :: cs) ulhs
461462
= if !(clauseMatches env lhs ulhs)

src/Core/GetType.idr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ mutual
3333
chkMeta fc env !(nf defs env (embed mty)) args
3434
chk env (Bind fc nm b sc)
3535
= do bt <- chkBinder env b
36-
sct <- chk {vars = _ :< nm} (b :: env) sc
36+
sct <- chk {vars = _ :< nm} (env :< b) sc
3737
pure $ gnf env (discharge fc nm b !(getTerm bt) !(getTerm sct))
3838
chk env (App fc f a)
3939
= do fty <- chk env f

0 commit comments

Comments
 (0)