Equations
- mkArray n v = { data := List.replicate n v }
Equations
- Array.instEmptyCollectionArray = { emptyCollection := #[] }
Equations
- Array.isEmpty a = decide (Array.size a = 0)
Low-level version of fget
which is as fast as a C array read.
Fin
values are represented as tag pointers in the Lean runtime. Thus,
fget
may be slightly slower than uget
.
Equations
- Array.uget a i h = a[USize.toNat i]
Equations
- Array.instGetElemArrayUSizeLtNatInstLTNatToNatSize = { getElem := fun xs i h => Array.uget xs i h }
Equations
- Array.back a = Array.get! a (Array.size a - 1)
Equations
- Array.get? a i = if h : i < Array.size a then some a[i] else none
Equations
- Array.back? a = Array.get? a (Array.size a - 1)
Equations
- Array.getLit a i h₁ h₂ = let_fun this := (_ : i < Array.size a); a[i]
Low-level version of fset
which is as fast as a C array fset.
Fin
values are represented as tag pointers in the Lean runtime. Thus,
fset
may be slightly slower than uset
.
Equations
- Array.uset a i v h = Array.set a { val := USize.toNat i, isLt := h } v
Equations
- Array.swap a i j = let v₁ := Array.get a i; let v₂ := Array.get a j; let a' := Array.set a i v₂; Array.set a' ((_ : Array.size a = Array.size (Array.set a i (Array.get a j))) ▸ j) v₁
Equations
- Array.swapAt a i v = let e := Array.get a i; let a := Array.set a i v; (e, a)
Equations
- Array.shrink a n = Array.shrink.loop (Array.size a - n) a
Equations
- Array.shrink.loop 0 x = x
- Array.shrink.loop (Nat.succ n) x = Array.shrink.loop n (Array.pop x)
Equations
- Array.modifyM a i f = if h : i < Array.size a then let idx := { val := i, isLt := h }; let v := Array.get a idx; do let v ← f v pure (Array.set a idx v) else pure a
Equations
- Array.modify a i f = Id.run (Array.modifyM a i f)
Equations
- Array.modifyOp self idx f = Array.modify self idx f
We claim this unsafe implementation is correct because an array cannot have more than usizeSz
elements in our runtime.
This kind of low level trick can be removed with a little bit of compiler support. For example, if the compiler simplifies as.size < usizeSz
to true.
Equations
- Array.forInUnsafe as b f = let sz := USize.ofNat (Array.size as); Array.forInUnsafe.loop as f sz 0 b
Reference implementation for forIn
Equations
- Array.forIn as b f = Array.forIn.loop as f (Array.size as) (_ : Array.size as ≤ Array.size as) b
Equations
- One or more equations did not get rendered due to their size.
- Array.forIn.loop as f 0 x b = pure b
See comment at forInUnsafe
Equations
- One or more equations did not get rendered due to their size.
Reference implementation for foldlM
Equations
- One or more equations did not get rendered due to their size.
See comment at forInUnsafe
Equations
- One or more equations did not get rendered due to their size.
Reference implementation for foldrM
Equations
- One or more equations did not get rendered due to their size.
See comment at forInUnsafe
Equations
- Array.mapMUnsafe f as = let sz := USize.ofNat (Array.size as); unsafeCast (Array.mapMUnsafe.map f sz 0 (unsafeCast as))
Reference implementation for mapM
Equations
- Array.mapM f as = Array.foldlM (fun bs a => do let b ← f a pure (Array.push bs b)) (Array.mkEmpty (Array.size as)) as 0 (Array.size as)
Equations
- Array.mapIdxM as f = Array.mapIdxM.map as f (Array.size as) 0 (_ : Array.size as + 0 = Array.size as + 0) (Array.mkEmpty (Array.size as))
Equations
- One or more equations did not get rendered due to their size.
- Array.mapIdxM.map as f 0 j x bs = pure bs
Equations
- Array.anyMUnsafe p as start stop = if start < stop then if stop ≤ Array.size as then Array.anyMUnsafe.any p as (USize.ofNat start) (USize.ofNat stop) else pure false else pure false
Equations
- Array.anyM p as start stop = let any := fun stop h => Array.anyM.loop p as stop h start; if h : stop ≤ Array.size as then any stop h else any (Array.size as) (_ : Array.size as ≤ Array.size as)
Equations
- Array.allM p as start stop = do let __do_lift ← Array.anyM (fun v => do let __do_lift ← p v pure !__do_lift) as start stop pure !__do_lift
Equations
- Array.findSomeRevM? as f = Array.findSomeRevM?.find as f (Array.size as) (_ : Array.size as ≤ Array.size as)
Equations
- One or more equations did not get rendered due to their size.
- Array.findSomeRevM?.find as f 0 x = pure none
Equations
- Array.forM f as start stop = Array.foldlM (fun x => f) PUnit.unit as start stop
Equations
- Array.forRevM f as start stop = Array.foldrM (fun a x => f a) PUnit.unit as start stop
Equations
- Array.foldl f init as start stop = Id.run (Array.foldlM f init as start stop)
Equations
- Array.foldr f init as start stop = Id.run (Array.foldrM f init as start stop)
Equations
- Array.mapIdx as f = Id.run (Array.mapIdxM as f)
Equations
- Array.find? as p = Id.run (Array.findM? as p)
Equations
- Array.findSome? as f = Id.run (Array.findSomeM? as f)
Equations
- Array.findSomeRev? as f = Id.run (Array.findSomeRevM? as f)
Equations
- Array.findRev? as p = Id.run (Array.findRevM? as p)
Equations
- Array.findIdx? as p = Array.findIdx?.loop as p (Array.size as) 0 (_ : Array.size as + 0 = Array.size as + 0)
Equations
- Array.getIdx? a v = Array.findIdx? a fun a => a == v
Equations
- Array.contains as a = Array.any as (fun b => a == b) 0 (Array.size as)
Equations
- Array.elem a as = Array.contains as a
Equations
- One or more equations did not get rendered due to their size.
Equations
- Array.toList as = Array.foldr List.cons [] as (Array.size as)
Equations
- Array.instToStringArray = { toString := fun a => "#" ++ toString (Array.toList a) }
Equations
- Array.append as bs = Array.foldl (fun r v => Array.push r v) as bs 0 (Array.size bs)
Equations
- Array.appendList as bs = List.foldl (fun r v => Array.push r v) as bs
Equations
- Array.concatMapM f as = Array.foldlM (fun bs a => do let __do_lift ← f a pure (bs ++ __do_lift)) #[] as 0 (Array.size as)
Equations
- Array.concatMap f as = Array.foldl (fun bs a => bs ++ f a) #[] as 0 (Array.size as)
Equations
- One or more equations did not get rendered due to their size.
Equations
- Array.isEqvAux a b hsz p i = if h : i < Array.size a then let_fun this := (_ : i < Array.size b); p a[i] b[i] && Array.isEqvAux a b hsz p (i + 1) else true
Equations
- Array.isEqv a b p = if h : Array.size a = Array.size b then Array.isEqvAux a b h p 0 else false
Equations
- Array.instBEqArray = { beq := fun a b => Array.isEqv a b BEq.beq }
Equations
- Array.filter p as start stop = Array.foldl (fun r a => if p a = true then Array.push r a else r) #[] as start stop
Equations
- Array.filterM p as start stop = Array.foldlM (fun r a => do let __do_lift ← p a if __do_lift = true then pure (Array.push r a) else pure r) #[] as start stop
Equations
- Array.filterMap f as start stop = Id.run (Array.filterMapM f as start stop)
Equations
- Array.getMax? as lt = if h : 0 < Array.size as then let a0 := as[0]; some (Array.foldl (fun best a => if lt best a = true then a else best) a0 as 1 (Array.size as)) else none
Equations
- Array.indexOfAux a v i = if h : i < Array.size a then let idx := { val := i, isLt := h }; if (Array.get a idx == v) = true then some idx else Array.indexOfAux a v (i + 1) else none
Equations
- Array.indexOf? a v = Array.indexOfAux a v 0
Equations
- One or more equations did not get rendered due to their size.
Equations
- One or more equations did not get rendered due to their size.
Equations
- Array.takeWhile p as = Array.takeWhile.go p as 0 #[]
Equations
- Array.feraseIdx a i = Array.eraseIdxAux (i.val + 1) a
Equations
- Array.eraseIdx a i = if i < Array.size a then Array.eraseIdxAux (i + 1) a else a
Equations
- One or more equations did not get rendered due to their size.
Equations
- Array.eraseIdx' a i = Array.eraseIdxSzAux a (i.val + 1) a (_ : Array.size a = Array.size a)
Equations
- Array.erase as a = match Array.indexOf? as a with | none => as | some i => Array.feraseIdx as i
Insert element a
at position i
.
Equations
- Array.insertAt as i a = let j := Array.size as; let as := Array.push as a; Array.insertAt.loop as i as { val := j, isLt := (_ : Array.size as < Array.size (Array.push as a)) }
Equations
- One or more equations did not get rendered due to their size.
Equations
- Array.toListLitAux a n hsz 0 x_3 x = x
- Array.toListLitAux a n hsz (Nat.succ i) hi x = Array.toListLitAux a n hsz i (_ : i ≤ Array.size a) (Array.getLit a i hsz (_ : i < n) :: x)
Equations
- Array.toArrayLit a n hsz = List.toArray (Array.toListLitAux a n hsz n (_ : n ≤ Array.size a) [])
Equations
- One or more equations did not get rendered due to their size.
Return true iff as
is a prefix of bs
.
That is, bs = as ++ t
for some t : List α
.
Equations
- Array.isPrefixOf as bs = if h : Array.size as ≤ Array.size bs then Array.isPrefixOfAux as bs h 0 else false
Equations
- Array.allDiff as = Array.allDiffAux as 0
Equations
- Array.zipWith as bs f = Array.zipWithAux f as bs 0 #[]
Equations
- Array.split as p = Array.foldl (fun x a => match x with | (as, bs) => if p a = true then (Array.push as a, bs) else (as, Array.push bs a)) (#[], #[]) as 0 (Array.size as)