Module docstring
{"# insertIdx
Proves various lemmas about List.insertIdx.
"}
{"# insertIdx
Proves various lemmas about List.insertIdx.
"}
List.sublist_insertIdx
      theorem
     (l : List α) (n : ℕ) (a : α) : l <+ (l.insertIdx n a)
        @[simp]
theorem sublist_insertIdx (l : List α) (n : ℕ) (a : α) : l <+ (l.insertIdx n a) := by
  simpa only [eraseIdx_insertIdx] using eraseIdx_sublist (l.insertIdx n a) n
        List.subset_insertIdx
      theorem
     (l : List α) (n : ℕ) (a : α) : l ⊆ l.insertIdx n a
        @[simp]
theorem subset_insertIdx (l : List α) (n : ℕ) (a : α) : l ⊆ l.insertIdx n a :=
  (sublist_insertIdx ..).subset
        List.insertIdx_eraseIdx
      theorem
     {l : List α} {n : ℕ} (hn : n ≠ length l) (a : α) : (l.eraseIdx n).insertIdx n a = l.set n a
        /-- Erasing `n`th element of a list, then inserting `a` at the same place
is the same as setting `n`th element to `a`.
We assume that `n ≠ length l`, because otherwise LHS equals `l ++ [a]` while RHS equals `l`. -/
@[simp]
theorem insertIdx_eraseIdx {l : List α} {n : ℕ} (hn : n ≠ length l) (a : α) :
    (l.eraseIdx n).insertIdx n a = l.set n a := by
  induction n generalizing l <;> cases l <;> simp_all
        List.insertIdx_eraseIdx_getElem
      theorem
     {l : List α} {n : ℕ} (hn : n < length l) : (l.eraseIdx n).insertIdx n l[n] = l
        
      List.insertIdx_subset_cons
      theorem
     (n : ℕ) (a : α) (l : List α) : l.insertIdx n a ⊆ a :: l
        theorem insertIdx_subset_cons (n : ℕ) (a : α) (l : List α) : l.insertIdx n a ⊆ a :: l := by
  intro b hb
  simpa using eq_or_mem_of_mem_insertIdx hb
        List.insertIdx_pmap
      theorem
     {p : α → Prop} (f : ∀ a, p a → β) {l : List α} {a : α} {n : ℕ} (hl : ∀ x ∈ l, p x) (ha : p a) :
  (l.pmap f hl).insertIdx n (f a ha) =
    (l.insertIdx n a).pmap f (fun _ h ↦ (eq_or_mem_of_mem_insertIdx h).elim (fun heq ↦ heq ▸ ha) (hl _))
        theorem insertIdx_pmap {p : α → Prop} (f : ∀ a, p a → β) {l : List α} {a : α} {n : ℕ}
    (hl : ∀ x ∈ l, p x) (ha : p a) :
    (l.pmap f hl).insertIdx n (f a ha) = (l.insertIdx n a).pmap f
      (fun _ h ↦ (eq_or_mem_of_mem_insertIdx h).elim (fun heq ↦ heq ▸ ha) (hl _)) := by
  induction n generalizing l with
  | zero => cases l <;> simp
  | succ n ihn => cases l <;> simp_all
        List.map_insertIdx
      theorem
     (f : α → β) (l : List α) (n : ℕ) (a : α) : (l.insertIdx n a).map f = (l.map f).insertIdx n (f a)
        theorem map_insertIdx (f : α → β) (l : List α) (n : ℕ) (a : α) :
    (l.insertIdx n a).map f = (l.map f).insertIdx n (f a) := by
  simpa only [pmap_eq_map] using (insertIdx_pmap (fun a _ ↦ f a) (fun _ _ ↦ trivial) trivial).symm
        List.eraseIdx_pmap
      theorem
     {p : α → Prop} (f : ∀ a, p a → β) {l : List α} (hl : ∀ a ∈ l, p a) (n : ℕ) :
  (pmap f l hl).eraseIdx n = (l.eraseIdx n).pmap f fun a ha ↦ hl a (eraseIdx_subset ha)
        theorem eraseIdx_pmap {p : α → Prop} (f : ∀ a, p a → β) {l : List α} (hl : ∀ a ∈ l, p a) (n : ℕ) :
    (pmap f l hl).eraseIdx n = (l.eraseIdx n).pmap f fun a ha ↦ hl a (eraseIdx_subset ha) :=
  match l, hl, n with
  | [], _, _ => rfl
  | a :: _, _, 0 => rfl
  | a :: as, h, n + 1 => by rw [forall_mem_cons] at h; simp [eraseIdx_pmap f h.2 n]
        List.eraseIdx_map
      theorem
     (f : α → β) (l : List α) (n : ℕ) : (map f l).eraseIdx n = (l.eraseIdx n).map f
        /-- Erasing an index commutes with `List.map`. -/
theorem eraseIdx_map (f : α → β) (l : List α) (n : ℕ) :
    (map f l).eraseIdx n = (l.eraseIdx n).map f := by
  simpa only [pmap_eq_map] using eraseIdx_pmap (fun a _ ↦ f a) (fun _ _ ↦ trivial) n
        List.insertIdx_injective
      theorem
     (n : ℕ) (x : α) : Function.Injective (fun l : List α => l.insertIdx n x)
        theorem insertIdx_injective (n : ℕ) (x : α) :
    Function.Injective (fun l : List α => l.insertIdx n x) := by
  induction n with
  | zero => simp
  | succ n IH => rintro (_ | ⟨a, as⟩) (_ | ⟨b, bs⟩) h <;> simpa [IH.eq_iff] using h