Skip to content

Commit 5e01e62

Browse files
authored
chore: review Array operations argument order (#6041)
This PR modifies the order of arguments for higher-order `Array` functions, preferring to put the `Array` last (besides positional arguments with defaults). This is more consistent with the `List` API, and is more flexible, as dot notation allows two different partially applied versions.
1 parent 3a408e0 commit 5e01e62

File tree

3 files changed

+38
-38
lines changed

3 files changed

+38
-38
lines changed

src/Init/Data/Array/Basic.lean

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -458,26 +458,26 @@ def mapFinIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m]
458458
map as.size 0 rfl (mkEmpty as.size)
459459

460460
@[inline]
461-
def mapIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : Nat → α → m β) : m (Array β) :=
461+
def mapIdxM {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : Nat → α → m β) (as : Array α) : m (Array β) :=
462462
as.mapFinIdxM fun i a => f i a
463463

464464
@[inline]
465-
def findSomeM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : α → m (Option β)) : m (Option β) := do
465+
def findSomeM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : α → m (Option β)) (as : Array α) : m (Option β) := do
466466
for a in as do
467467
match (← f a) with
468468
| some b => return b
469469
| _ => pure ⟨⟩
470470
return none
471471

472472
@[inline]
473-
def findM? {α : Type} {m : TypeType} [Monad m] (as : Array α) (p : α → m Bool) : m (Option α) := do
473+
def findM? {α : Type} {m : TypeType} [Monad m] (p : α → m Bool) (as : Array α) : m (Option α) := do
474474
for a in as do
475475
if (← p a) then
476476
return a
477477
return none
478478

479479
@[inline]
480-
def findIdxM? [Monad m] (as : Array α) (p : α → m Bool) : m (Option Nat) := do
480+
def findIdxM? [Monad m] (p : α → m Bool) (as : Array α) : m (Option Nat) := do
481481
let mut i := 0
482482
for a in as do
483483
if (← p a) then
@@ -529,7 +529,7 @@ def allM {α : Type u} {m : Type → Type w} [Monad m] (p : α → m Bool) (as :
529529
return !(← as.anyM (start := start) (stop := stop) fun v => return !(← p v))
530530

531531
@[inline]
532-
def findSomeRevM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (as : Array α) (f : α → m (Option β)) : m (Option β) :=
532+
def findSomeRevM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m] (f : α → m (Option β)) (as : Array α) : m (Option β) :=
533533
let rec @[specialize] find : (i : Nat) → i ≤ as.size → m (Option β)
534534
| 0, _ => pure none
535535
| i+1, h => do
@@ -543,7 +543,7 @@ def findSomeRevM? {α : Type u} {β : Type v} {m : Type v → Type w} [Monad m]
543543
find as.size (Nat.le_refl _)
544544

545545
@[inline]
546-
def findRevM? {α : Type} {m : TypeType w} [Monad m] (as : Array α) (p : α → m Bool) : m (Option α) :=
546+
def findRevM? {α : Type} {m : TypeType w} [Monad m] (p : α → m Bool) (as : Array α) : m (Option α) :=
547547
as.findSomeRevM? fun a => return if (← p a) then some a else none
548548

549549
@[inline]
@@ -572,37 +572,37 @@ def mapFinIdx {α : Type u} {β : Type v} (as : Array α) (f : Fin as.size →
572572
Id.run <| as.mapFinIdxM f
573573

574574
@[inline]
575-
def mapIdx {α : Type u} {β : Type v} (as : Array α) (f : Nat → α → β) : Array β :=
575+
def mapIdx {α : Type u} {β : Type v} (f : Nat → α → β) (as : Array α) : Array β :=
576576
Id.run <| as.mapIdxM f
577577

578578
/-- Turns `#[a, b]` into `#[(a, 0), (b, 1)]`. -/
579579
def zipWithIndex (arr : Array α) : Array (α × Nat) :=
580580
arr.mapIdx fun i a => (a, i)
581581

582582
@[inline]
583-
def find? {α : Type} (as : Array α) (p : α → Bool) : Option α :=
583+
def find? {α : Type} (p : α → Bool) (as : Array α) : Option α :=
584584
Id.run <| as.findM? p
585585

586586
@[inline]
587-
def findSome? {α : Type u} {β : Type v} (as : Array α) (f : α → Option β) : Option β :=
587+
def findSome? {α : Type u} {β : Type v} (f : α → Option β) (as : Array α) : Option β :=
588588
Id.run <| as.findSomeM? f
589589

590590
@[inline]
591-
def findSome! {α : Type u} {β : Type v} [Inhabited β] (a : Array α) (f : α → Option β) : β :=
592-
match findSome? a f with
591+
def findSome! {α : Type u} {β : Type v} [Inhabited β] (f : α → Option β) (a : Array α) : β :=
592+
match a.findSome? f with
593593
| some b => b
594594
| none => panic! "failed to find element"
595595

596596
@[inline]
597-
def findSomeRev? {α : Type u} {β : Type v} (as : Array α) (f : α → Option β) : Option β :=
597+
def findSomeRev? {α : Type u} {β : Type v} (f : α → Option β) (as : Array α) : Option β :=
598598
Id.run <| as.findSomeRevM? f
599599

600600
@[inline]
601-
def findRev? {α : Type} (as : Array α) (p : α → Bool) : Option α :=
601+
def findRev? {α : Type} (p : α → Bool) (as : Array α) : Option α :=
602602
Id.run <| as.findRevM? p
603603

604604
@[inline]
605-
def findIdx? {α : Type u} (as : Array α) (p : α → Bool) : Option Nat :=
605+
def findIdx? {α : Type u} (p : α → Bool) (as : Array α) : Option Nat :=
606606
let rec @[semireducible] -- This is otherwise irreducible because it uses well-founded recursion.
607607
loop (j : Nat) :=
608608
if h : j < as.size then

src/Init/Data/Array/Lemmas.lean

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ theorem foldl_toArray (f : β → α → β) (init : β) (l : List α) :
210210

211211
theorem findSomeRevM?_find_toArray [Monad m] [LawfulMonad m] (f : α → m (Option β)) (l : List α)
212212
(i : Nat) (h) :
213-
findSomeRevM?.find l.toArray f i h = (l.take i).reverse.findSomeM? f := by
213+
findSomeRevM?.find f l.toArray i h = (l.take i).reverse.findSomeM? f := by
214214
induction i generalizing l with
215215
| zero => simp [Array.findSomeRevM?.find.eq_def]
216216
| succ i ih =>
@@ -1470,7 +1470,7 @@ termination_by stop - start
14701470

14711471
-- This could also be proved from `SatisfiesM_anyM_iff_exists` in `Batteries.Data.Array.Init.Monadic`
14721472
theorem any_iff_exists {p : α → Bool} {as : Array α} {start stop} :
1473-
any as p start stop ↔ ∃ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop ∧ p as[i] := by
1473+
as.any p start stop ↔ ∃ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop ∧ p as[i] := by
14741474
dsimp [any, anyM, Id.run]
14751475
split
14761476
· rw [anyM_loop_iff_exists]; rfl
@@ -1482,7 +1482,7 @@ theorem any_iff_exists {p : α → Bool} {as : Array α} {start stop} :
14821482
exact ⟨i, by omega, by omega, h⟩
14831483

14841484
theorem any_eq_true {p : α → Bool} {as : Array α} :
1485-
any as p ↔ ∃ i : Fin as.size, p as[i] := by simp [any_iff_exists, Fin.isLt]
1485+
as.any p ↔ ∃ i : Fin as.size, p as[i] := by simp [any_iff_exists, Fin.isLt]
14861486

14871487
theorem any_toList {p : α → Bool} (as : Array α) : as.toList.any p = as.any p := by
14881488
rw [Bool.eq_iff_iff, any_eq_true, List.any_eq_true]; simp only [List.mem_iff_get]
@@ -1502,20 +1502,20 @@ theorem allM_eq_not_anyM_not [Monad m] [LawfulMonad m] (p : α → m Bool) (as :
15021502
rw [List.allM_eq_not_anyM_not]
15031503

15041504
theorem all_eq_not_any_not (p : α → Bool) (as : Array α) (start stop) :
1505-
all as p start stop = !(any as (!p ·) start stop) := by
1505+
as.all p start stop = !(as.any (!p ·) start stop) := by
15061506
dsimp [all, allM]
15071507
rfl
15081508

15091509
theorem all_iff_forall {p : α → Bool} {as : Array α} {start stop} :
1510-
all as p start stop ↔ ∀ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop → p as[i] := by
1510+
as.all p start stop ↔ ∀ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop → p as[i] := by
15111511
rw [all_eq_not_any_not]
1512-
suffices ¬(any as (!p ·) start stop = true) ↔
1512+
suffices ¬(as.any (!p ·) start stop = true) ↔
15131513
∀ i : Fin as.size, start ≤ i.1 ∧ i.1 < stop → p as[i] by
15141514
simp_all
15151515
rw [any_iff_exists]
15161516
simp
15171517

1518-
theorem all_eq_true {p : α → Bool} {as : Array α} : all as p ↔ ∀ i : Fin as.size, p as[i] := by
1518+
theorem all_eq_true {p : α → Bool} {as : Array α} : as.all p ↔ ∀ i : Fin as.size, p as[i] := by
15191519
simp [all_iff_forall, Fin.isLt]
15201520

15211521
theorem all_toList {p : α → Bool} (as : Array α) : as.toList.all p = as.all p := by

src/Init/Data/Array/MapIdx.lean

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -66,35 +66,35 @@ theorem mapFinIdx_spec (as : Array α) (f : Fin as.size → α → β)
6666

6767
/-! ### mapIdx -/
6868

69-
theorem mapIdx_induction (as : Array α) (f : Nat → α → β)
69+
theorem mapIdx_induction (f : Nat → α → β) (as : Array α)
7070
(motive : Nat → Prop) (h0 : motive 0)
7171
(p : Fin as.size → β → Prop)
7272
(hs : ∀ i, motive i.1 → p i (f i as[i]) ∧ motive (i + 1)) :
73-
motive as.size ∧ ∃ eq : (Array.mapIdx as f).size = as.size,
74-
∀ i h, p ⟨i, h⟩ ((Array.mapIdx as f)[i]) :=
73+
motive as.size ∧ ∃ eq : (as.mapIdx f).size = as.size,
74+
∀ i h, p ⟨i, h⟩ ((as.mapIdx f)[i]) :=
7575
mapFinIdx_induction as (fun i a => f i a) motive h0 p hs
7676

77-
theorem mapIdx_spec (as : Array α) (f : Nat → α → β)
77+
theorem mapIdx_spec (f : Nat → α → β) (as : Array α)
7878
(p : Fin as.size → β → Prop) (hs : ∀ i, p i (f i as[i])) :
79-
∃ eq : (Array.mapIdx as f).size = as.size,
80-
∀ i h, p ⟨i, h⟩ ((Array.mapIdx as f)[i]) :=
79+
∃ eq : (as.mapIdx f).size = as.size,
80+
∀ i h, p ⟨i, h⟩ ((as.mapIdx f)[i]) :=
8181
(mapIdx_induction _ _ (fun _ => True) trivial p fun _ _ => ⟨hs .., trivial⟩).2
8282

83-
@[simp] theorem size_mapIdx (a : Array α) (f : Nat → α → β) : (a.mapIdx f).size = a.size :=
83+
@[simp] theorem size_mapIdx (f : Nat → α → β) (as : Array α) : (as.mapIdx f).size = as.size :=
8484
(mapIdx_spec (p := fun _ _ => True) (hs := fun _ => trivial)).1
8585

86-
@[simp] theorem getElem_mapIdx (a : Array α) (f : Nat → α → β) (i : Nat)
87-
(h : i < (mapIdx a f).size) :
88-
(a.mapIdx f)[i] = f i (a[i]'(by simp_all)) :=
89-
(mapIdx_spec _ _ (fun i b => b = f i a[i]) fun _ => rfl).2 i (by simp_all)
86+
@[simp] theorem getElem_mapIdx (f : Nat → α → β) (as : Array α) (i : Nat)
87+
(h : i < (as.mapIdx f).size) :
88+
(as.mapIdx f)[i] = f i (as[i]'(by simp_all)) :=
89+
(mapIdx_spec _ _ (fun i b => b = f i as[i]) fun _ => rfl).2 i (by simp_all)
9090

91-
@[simp] theorem getElem?_mapIdx (a : Array α) (f : Nat → α → β) (i : Nat) :
92-
(a.mapIdx f)[i]? =
93-
a[i]?.map (f i) := by
91+
@[simp] theorem getElem?_mapIdx (f : Nat → α → β) (as : Array α) (i : Nat) :
92+
(as.mapIdx f)[i]? =
93+
as[i]?.map (f i) := by
9494
simp [getElem?_def, size_mapIdx, getElem_mapIdx]
9595

96-
@[simp] theorem toList_mapIdx (a : Array α) (f : Nat → α → β) :
97-
(a.mapIdx f).toList = a.toList.mapIdx (fun i a => f i a) := by
96+
@[simp] theorem toList_mapIdx (f : Nat → α → β) (as : Array α) :
97+
(as.mapIdx f).toList = as.toList.mapIdx (fun i a => f i a) := by
9898
apply List.ext_getElem <;> simp
9999

100100
end Array
@@ -105,7 +105,7 @@ namespace List
105105
l.toArray.mapFinIdx f = (l.mapFinIdx f).toArray := by
106106
ext <;> simp
107107

108-
@[simp] theorem mapIdx_toArray (l : List α) (f : Nat → α → β) :
108+
@[simp] theorem mapIdx_toArray (f : Nat → α → β) (l : List α) :
109109
l.toArray.mapIdx f = (l.mapIdx f).toArray := by
110110
ext <;> simp
111111

0 commit comments

Comments
 (0)