Documentation

Init.Data.Array.Basic

Array literal syntax #

Equations
  • One or more equations did not get rendered due to their size.

Preliminary theorems #

@[simp]
theorem Array.size_set {α : Type u} (a : Array α) (i : Fin a.size) (v : α) :
(a.set i v).size = a.size
@[simp]
theorem Array.size_push {α : Type u} (a : Array α) (v : α) :
(a.push v).size = a.size + 1
theorem Array.ext {α : Type u} (a : Array α) (b : Array α) (h₁ : a.size = b.size) (h₂ : ∀ (i : Nat) (hi₁ : i < a.size) (hi₂ : i < b.size), a[i] = b[i]) :
a = b
theorem Array.ext.extAux {α : Type u} (a : List α) (b : List α) (h₁ : a.length = b.length) (h₂ : ∀ (i : Nat) (hi₁ : i < a.length) (hi₂ : i < b.length), a.get i, hi₁ = b.get i, hi₂) :
a = b
theorem Array.ext' {α : Type u} {as : Array α} {bs : Array α} (h : as.toList = bs.toList) :
as = bs
@[simp]
theorem Array.toArrayAux_eq {α : Type u} (as : List α) (acc : Array α) :
(as.toArrayAux acc).toList = acc.toList ++ as
@[simp]
theorem Array.toList_toArray {α : Type u} (as : List α) :
as.toArray.toList = as
@[simp]
theorem Array.size_toArray {α : Type u} (as : List α) :
as.toArray.size = as.length
@[reducible, inline, deprecated Array.toList_toArray]
abbrev Array.data_toArray {α : Type u_1} (as : List α) :
as.toArray.toList = as
Equations
@[reducible, inline, deprecated Array.toList]
abbrev Array.Array.data {α : Type u_1} (self : Array α) :
List α
Equations

Externs #

@[extern lean_array_size]
def Array.usize {α : Type u} (a : Array α) :

Low-level version of size that directly queries the C array object cached size. While this is not provable, usize always returns the exact size of the array since the implementation only supports arrays of size less than USize.size.

Equations
  • a.usize = a.size.toUSize
@[extern lean_array_uget]
def Array.uget {α : Type u} (a : Array α) (i : USize) (h : i.toNat < a.size) :
α

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
  • a.uget i h = a[i.toNat]
@[extern lean_array_uset]
def Array.uset {α : Type u} (a : Array α) (i : USize) (v : α) (h : i.toNat < a.size) :

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
  • a.uset i v h = a.set i.toNat, h v
@[extern lean_array_pop]
def Array.pop {α : Type u} (a : Array α) :
Equations
  • a.pop = { toList := a.toList.dropLast }
@[simp]
theorem Array.size_pop {α : Type u} (a : Array α) :
a.pop.size = a.size - 1
@[extern lean_mk_array]
def Array.mkArray {α : Type u} (n : Nat) (v : α) :
Equations
@[extern lean_array_fswap]
def Array.swap {α : Type u} (a : Array α) (i : Fin a.size) (j : Fin a.size) :

Swaps two entries in an array.

This will perform the update destructively provided that a has a reference count of 1 when called.

Equations
  • a.swap i j = (a.set i (a.get j)).set (j) (a.get i)
@[simp]
theorem Array.size_swap {α : Type u} (a : Array α) (i : Fin a.size) (j : Fin a.size) :
(a.swap i j).size = a.size
@[extern lean_array_swap]
def Array.swap! {α : Type u} (a : Array α) (i : Nat) (j : Nat) :

Swaps two entries in an array, or returns the array unchanged if either index is out of bounds.

This will perform the update destructively provided that a has a reference count of 1 when called.

Equations
  • a.swap! i j = if h₁ : i < a.size then if h₂ : j < a.size then a.swap i, h₁ j, h₂ else a else a

GetElem instance for USize, backed by uget #

instance Array.instGetElemUSizeLtNatToNatSize {α : Type u} :
GetElem (Array α) USize α fun (xs : Array α) (i : USize) => i.toNat < xs.size
Equations
  • Array.instGetElemUSizeLtNatToNatSize = { getElem := fun (xs : Array α) (i : USize) (h : i.toNat < xs.size) => xs.uget i h }

Definitions #

Equations
  • Array.instEmptyCollection = { emptyCollection := #[] }
instance Array.instInhabited {α : Type u} :
Equations
  • Array.instInhabited = { default := #[] }
def Array.isEmpty {α : Type u} (a : Array α) :
Equations
@[specialize #[]]
def Array.isEqvAux {α : Type u} (a : Array α) (b : Array α) (hsz : a.size = b.size) (p : ααBool) (i : Nat) :
i a.sizeBool
Equations
  • a.isEqvAux b hsz p 0 x_2 = true
  • a.isEqvAux b hsz p i.succ h = (p a[i] b[i] && a.isEqvAux b hsz p i )
@[inline]
def Array.isEqv {α : Type u} (a : Array α) (b : Array α) (p : ααBool) :
Equations
  • a.isEqv b p = if h : a.size = b.size then a.isEqvAux b h p a.size else false
instance Array.instBEq {α : Type u} [BEq α] :
BEq (Array α)
Equations
  • Array.instBEq = { beq := fun (a b : Array α) => a.isEqv b BEq.beq }
def Array.ofFn {α : Type u} {n : Nat} (f : Fin nα) :

ofFn f with f : Fin n → α returns the list whose ith element is f i.

ofFn f = #[f 0, f 1, ... , f(n - 1)]
Equations
def Array.ofFn.go {α : Type u} {n : Nat} (f : Fin nα) (i : Nat) (acc : Array α) :

Auxiliary for ofFn. ofFn.go f i acc = acc ++ #[f i, ..., f(n - 1)]

Equations

The array #[0, 1, ..., n - 1].

Equations
def Array.singleton {α : Type u} (v : α) :
Equations
def Array.back {α : Type u} [Inhabited α] (a : Array α) :
α
Equations
  • a.back = a.get! (a.size - 1)
def Array.get? {α : Type u} (a : Array α) (i : Nat) :
Equations
  • a.get? i = if h : i < a.size then some a[i] else none
def Array.back? {α : Type u} (a : Array α) :
Equations
  • a.back? = a.get? (a.size - 1)
@[inline]
def Array.swapAt {α : Type u} (a : Array α) (i : Fin a.size) (v : α) :
α × Array α
Equations
  • a.swapAt i v = (a.get i, a.set i v)
@[inline]
def Array.swapAt! {α : Type u} (a : Array α) (i : Nat) (v : α) :
α × Array α
Equations
  • One or more equations did not get rendered due to their size.
def Array.shrink {α : Type u} (a : Array α) (n : Nat) :
Equations
def Array.shrink.loop {α : Type u} :
NatArray αArray α
Equations
@[inline]
unsafe def Array.modifyMUnsafe {α : Type u} {m : Type u → Type u_1} [Monad m] (a : Array α) (i : Nat) (f : αm α) :
m (Array α)
@[implemented_by Array.modifyMUnsafe]
def Array.modifyM {α : Type u} {m : Type u → Type u_1} [Monad m] (a : Array α) (i : Nat) (f : αm α) :
m (Array α)
Equations
  • a.modifyM i f = if h : i < a.size then let idx := i, h; let v := a.get idx; do let vf v pure (a.set idx v) else pure a
@[inline]
def Array.modify {α : Type u} (a : Array α) (i : Nat) (f : αα) :
Equations
  • a.modify i f = (a.modifyM i f).run
@[inline]
def Array.modifyOp {α : Type u} (self : Array α) (idx : Nat) (f : αα) :
Equations
  • self.modifyOp idx f = self.modify idx f
@[inline]
unsafe def Array.forInUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (b : β) (f : αβm (ForInStep β)) :
m β

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.

@[specialize #[]]
unsafe def Array.forInUnsafe.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : αβm (ForInStep β)) (sz : USize) (i : USize) (b : β) :
m β
@[implemented_by Array.forInUnsafe]
def Array.forIn {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (b : β) (f : αβm (ForInStep β)) :
m β

Reference implementation for forIn

Equations
def Array.forIn.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : αβm (ForInStep β)) (i : Nat) (h : i as.size) (b : β) :
m β
Equations
instance Array.instForIn {α : Type u} {m : Type u_1 → Type u_2} :
ForIn m (Array α) α
Equations
  • Array.instForIn = { forIn := fun {β : Type ?u.19} [Monad m] => Array.forIn }
@[inline]
unsafe def Array.foldlMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (init : β) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
m β

See comment at forInUnsafe

@[specialize #[]]
unsafe def Array.foldlMUnsafe.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (as : Array α) (i : USize) (stop : USize) (b : β) :
m β
@[implemented_by Array.foldlMUnsafe]
def Array.foldlM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (init : β) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
m β

Reference implementation for foldlM

Equations
  • One or more equations did not get rendered due to their size.
def Array.foldlM.loop {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : βαm β) (as : Array α) (stop : Nat) (h : stop as.size) (i : Nat) (j : Nat) (b : β) :
m β
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
unsafe def Array.foldrMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (init : β) (as : Array α) (start : optParam Nat as.size) (stop : optParam Nat 0) :
m β

See comment at forInUnsafe

@[specialize #[]]
unsafe def Array.foldrMUnsafe.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (as : Array α) (i : USize) (stop : USize) (b : β) :
m β
@[implemented_by Array.foldrMUnsafe]
def Array.foldrM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (init : β) (as : Array α) (start : optParam Nat as.size) (stop : optParam Nat 0) :
m β

Reference implementation for foldrM

Equations
  • One or more equations did not get rendered due to their size.
def Array.foldrM.fold {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αβm β) (as : Array α) (stop : optParam Nat 0) (i : Nat) (h : i as.size) (b : β) :
m β
Equations
@[inline]
unsafe def Array.mapMUnsafe {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) :
m (Array β)

See comment at forInUnsafe

@[specialize #[]]
unsafe def Array.mapMUnsafe.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (sz : USize) (i : USize) (r : Array NonScalar) :
@[implemented_by Array.mapMUnsafe]
def Array.mapM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) :
m (Array β)

Reference implementation for mapM

Equations
def Array.mapM.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : αm β) (as : Array α) (i : Nat) (r : Array β) :
m (Array β)
Equations
@[inline]
def Array.mapIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : Fin as.sizeαm β) :
m (Array β)
Equations
@[specialize #[]]
def Array.mapIdxM.map {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : Fin as.sizeαm β) (i : Nat) (j : Nat) (inv : i + j = as.size) (bs : Array β) :
m (Array β)
Equations
@[inline]
def Array.findSomeM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : αm (Option β)) :
m (Option β)
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.findM? {α : Type} {m : TypeType} [Monad m] (as : Array α) (p : αm Bool) :
m (Option α)
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.findIdxM? {α : Type u} {m : TypeType u_1} [Monad m] (as : Array α) (p : αm Bool) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
unsafe def Array.anyMUnsafe {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
@[specialize #[]]
unsafe def Array.anyMUnsafe.any {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (i : USize) (stop : USize) :
@[implemented_by Array.anyMUnsafe]
def Array.anyM {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
  • One or more equations did not get rendered due to their size.
def Array.anyM.loop {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (stop : Nat) (h : stop as.size) (j : Nat) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.allM {α : Type u} {m : TypeType w} [Monad m] (p : αm Bool) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
@[inline]
def Array.findSomeRevM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : αm (Option β)) :
m (Option β)
Equations
@[specialize #[]]
def Array.findSomeRevM?.find {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : αm (Option β)) (i : Nat) :
i as.sizem (Option β)
Equations
@[inline]
def Array.findRevM? {α : Type} {m : TypeType w} [Monad m] (as : Array α) (p : αm Bool) :
m (Option α)
Equations
  • as.findRevM? p = as.findSomeRevM? fun (a : α) => do let __do_liftp a pure (if __do_lift = true then some a else none)
@[inline]
def Array.forM {α : Type u} {m : Type v → Type w} [Monad m] (f : αm PUnit) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
@[inline]
def Array.forRevM {α : Type u} {m : Type v → Type w} [Monad m] (f : αm PUnit) (as : Array α) (start : optParam Nat as.size) (stop : optParam Nat 0) :
Equations
@[inline]
def Array.foldl {α : Type u} {β : Type v} (f : βαβ) (init : β) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
β
Equations
@[inline]
def Array.foldr {α : Type u} {β : Type v} (f : αββ) (init : β) (as : Array α) (start : optParam Nat as.size) (stop : optParam Nat 0) :
β
Equations
@[inline]
def Array.map {α : Type u} {β : Type v} (f : αβ) (as : Array α) :
Equations
@[inline]
def Array.mapIdx {α : Type u} {β : Type v} (as : Array α) (f : Fin as.sizeαβ) :
Equations
  • as.mapIdx f = (as.mapIdxM f).run
def Array.zipWithIndex {α : Type u} (arr : Array α) :
Array (α × Nat)

Turns #[a, b] into #[(a, 0), (b, 1)].

Equations
  • arr.zipWithIndex = arr.mapIdx fun (i : Fin arr.size) (a : α) => (a, i)
@[inline]
def Array.find? {α : Type} (as : Array α) (p : αBool) :
Equations
  • as.find? p = (as.findM? p).run
@[inline]
def Array.findSome? {α : Type u} {β : Type v} (as : Array α) (f : αOption β) :
Equations
  • as.findSome? f = (as.findSomeM? f).run
@[inline]
def Array.findSome! {α : Type u} {β : Type v} [Inhabited β] (a : Array α) (f : αOption β) :
β
Equations
  • a.findSome! f = match a.findSome? f with | some b => b | none => panicWithPosWithDecl "Init.Data.Array.Basic" "Array.findSome!" 537 14 "failed to find element"
@[inline]
def Array.findSomeRev? {α : Type u} {β : Type v} (as : Array α) (f : αOption β) :
Equations
  • as.findSomeRev? f = (as.findSomeRevM? f).run
@[inline]
def Array.findRev? {α : Type} (as : Array α) (p : αBool) :
Equations
  • as.findRev? p = (as.findRevM? p).run
@[inline]
def Array.findIdx? {α : Type u} (as : Array α) (p : αBool) :
Equations
def Array.findIdx?.loop {α : Type u} (as : Array α) (p : αBool) (j : Nat) :
Equations
def Array.getIdx? {α : Type u} [BEq α] (a : Array α) (v : α) :
Equations
  • a.getIdx? v = a.findIdx? fun (a : α) => a == v
def Array.indexOfAux {α : Type u} [BEq α] (a : Array α) (v : α) (i : Nat) :
Option (Fin a.size)
Equations
  • a.indexOfAux v i = if h : i < a.size then let idx := i, h; if (a.get idx == v) = true then some idx else a.indexOfAux v (i + 1) else none
def Array.indexOf? {α : Type u} [BEq α] (a : Array α) (v : α) :
Option (Fin a.size)
Equations
  • a.indexOf? v = a.indexOfAux v 0
@[inline]
def Array.any {α : Type u} (as : Array α) (p : αBool) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
@[inline]
def Array.all {α : Type u} (as : Array α) (p : αBool) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
def Array.contains {α : Type u} [BEq α] (as : Array α) (a : α) :
Equations
  • as.contains a = as.any fun (x : α) => x == a
def Array.elem {α : Type u} [BEq α] (a : α) (as : Array α) :
Equations
@[export lean_array_to_list_impl]
def Array.toListImpl {α : Type u} (as : Array α) :
List α

Convert a Array α into an List α. This is O(n) in the size of the array.

Equations
@[inline]
def Array.toListAppend {α : Type u} (as : Array α) (l : List α) :
List α

Prepends an Array α onto the front of a list. Equivalent to as.toList ++ l.

Equations
def Array.append {α : Type u} (as : Array α) (bs : Array α) :
Equations
instance Array.instAppend {α : Type u} :
Equations
  • Array.instAppend = { append := Array.append }
def Array.appendList {α : Type u} (as : Array α) (bs : List α) :
Equations
instance Array.instHAppendList {α : Type u} :
HAppend (Array α) (List α) (Array α)
Equations
  • Array.instHAppendList = { hAppend := Array.appendList }
@[inline]
def Array.concatMapM {α : Type u} {m : Type u_1 → Type u_2} {β : Type u_1} [Monad m] (f : αm (Array β)) (as : Array α) :
m (Array β)
Equations
@[inline]
def Array.concatMap {α : Type u} {β : Type u_1} (f : αArray β) (as : Array α) :
Equations
@[inline]
def Array.flatten {α : Type u} (as : Array (Array α)) :

Joins array of array into a single array.

flatten #[#[a₁, a₂, ⋯], #[b₁, b₂, ⋯], ⋯] = #[a₁, a₂, ⋯, b₁, b₂, ⋯]

Equations
@[inline]
def Array.filter {α : Type u} (p : αBool) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
@[inline]
def Array.filterM {m : TypeType u_1} {α : Type} [Monad m] (p : αm Bool) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
m (Array α)
Equations
@[specialize #[]]
def Array.filterMapM {α : Type u} {m : Type u_1 → Type u_2} {β : Type u_1} [Monad m] (f : αm (Option β)) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
m (Array β)
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.filterMap {α : Type u} {β : Type u_1} (f : αOption β) (as : Array α) (start : optParam Nat 0) (stop : optParam Nat as.size) :
Equations
@[specialize #[]]
def Array.getMax? {α : Type u} (as : Array α) (lt : ααBool) :
Equations
  • as.getMax? lt = if h : 0 < as.size then let a0 := as[0]; some (Array.foldl (fun (best a : α) => if lt best a = true then a else best) a0 as 1) else none
@[inline]
def Array.partition {α : Type u} (p : αBool) (as : Array α) :
Array α × Array α
Equations
  • One or more equations did not get rendered due to their size.
def Array.reverse {α : Type u} (as : Array α) :
Equations
theorem Array.reverse.termination {i : Nat} {j : Nat} (h : i < j) :
j - 1 - (i + 1) < j - i
@[irreducible]
def Array.reverse.loop {α : Type u} (as : Array α) (i : Nat) (j : Fin as.size) :
Equations
def Array.popWhile {α : Type u} (p : αBool) (as : Array α) :
Equations
def Array.takeWhile {α : Type u} (p : αBool) (as : Array α) :
Equations
def Array.takeWhile.go {α : Type u} (p : αBool) (as : Array α) (i : Nat) (r : Array α) :
Equations
def Array.feraseIdx {α : Type u} (a : Array α) (i : Fin a.size) :

Remove the element at a given index from an array without bounds checks, using a Fin index.

This function takes worst case O(n) time because it has to backshift all elements at positions greater than i.

Equations
  • a.feraseIdx i = if h : i + 1 < a.size then let a' := a.swap i + 1, h i; let i' := i + 1, ; a'.feraseIdx i' else a.pop
@[simp]
theorem Array.size_feraseIdx {α : Type u} (a : Array α) (i : Fin a.size) :
(a.feraseIdx i).size = a.size - 1
def Array.eraseIdx {α : Type u} (a : Array α) (i : Nat) :

Remove the element at a given index from an array, or do nothing if the index is out of bounds.

This function takes worst case O(n) time because it has to backshift all elements at positions greater than i.

Equations
  • a.eraseIdx i = if h : i < a.size then a.feraseIdx i, h else a
def Array.erase {α : Type u} [BEq α] (as : Array α) (a : α) :
Equations
  • as.erase a = match as.indexOf? a with | none => as | some i => as.feraseIdx i
@[inline]
def Array.insertAt {α : Type u} (as : Array α) (i : Fin (as.size + 1)) (a : α) :

Insert element a at position i.

Equations
def Array.insertAt.loop {α : Type u} (as : Array α) (i : Fin (as✝.size + 1)) (as : Array α) (j : Fin as.size) :
Equations
def Array.insertAt! {α : Type u} (as : Array α) (i : Nat) (a : α) :

Insert element a at position i. Panics if i is not i ≤ as.size.

Equations
  • as.insertAt! i a = if h : i as.size then as.insertAt i, a else panicWithPosWithDecl "Init.Data.Array.Basic" "Array.insertAt!" 763 7 "invalid index"
def Array.isPrefixOfAux {α : Type u} [BEq α] (as : Array α) (bs : Array α) (hle : as.size bs.size) (i : Nat) :
Equations
  • as.isPrefixOfAux bs hle i = if h : i < as.size then let a := as[i]; let_fun this := ; let b := bs[i]; if (a == b) = true then as.isPrefixOfAux bs hle (i + 1) else false else true
def Array.isPrefixOf {α : Type u} [BEq α] (as : Array α) (bs : Array α) :

Return true iff as is a prefix of bs. That is, bs = as ++ t for some t : List α.

Equations
  • as.isPrefixOf bs = if h : as.size bs.size then as.isPrefixOfAux bs h 0 else false
@[specialize #[]]
def Array.zipWithAux {α : Type u} {β : Type u_1} {γ : Type u_2} (f : αβγ) (as : Array α) (bs : Array β) (i : Nat) (cs : Array γ) :
Equations
  • One or more equations did not get rendered due to their size.
@[inline]
def Array.zipWith {α : Type u} {β : Type u_1} {γ : Type u_2} (as : Array α) (bs : Array β) (f : αβγ) :
Equations
def Array.zip {α : Type u} {β : Type u_1} (as : Array α) (bs : Array β) :
Array (α × β)
Equations
  • as.zip bs = as.zipWith bs Prod.mk
def Array.unzip {α : Type u} {β : Type u_1} (as : Array (α × β)) :
Array α × Array β
Equations
  • as.unzip = Array.foldl (fun (x : Array α × Array β) (x_1 : α × β) => match x with | (as, bs) => match x_1 with | (a, b) => (as.push a, bs.push b)) (#[], #[]) as
def Array.split {α : Type u} (as : Array α) (p : αBool) :
Array α × Array α
Equations
  • as.split p = Array.foldl (fun (x : Array α × Array α) (a : α) => match x with | (as, bs) => if p a = true then (as.push a, bs) else (as, bs.push a)) (#[], #[]) as

Auxiliary functions used in metaprogramming. #

We do not intend to provide verification theorems for these functions.

eraseReps #

def Array.eraseReps {α : Type u_1} [BEq α] (as : Array α) :

O(|l|). Erase repeated adjacent elements. Keeps the first occurrence of each run.

  • eraseReps #[1, 3, 2, 2, 2, 3, 5] = #[1, 3, 2, 3, 5]
Equations
  • One or more equations did not get rendered due to their size.

allDiff #

def Array.allDiff {α : Type u} [BEq α] (as : Array α) :
Equations

getEvenElems #

@[inline]
def Array.getEvenElems {α : Type u} (as : Array α) :
Equations
  • One or more equations did not get rendered due to their size.

Repr and ToString #

instance Array.instRepr {α : Type u} [Repr α] :
Repr (Array α)
Equations
  • One or more equations did not get rendered due to their size.
instance Array.instToString {α : Type u} [ToString α] :
Equations
  • Array.instToString = { toString := fun (a : Array α) => "#" ++ toString a.toList }