Lemmas about array iterators #
This module provides lemmas about the interactions of Array.iterM with IterM.step and various
collectors.
theorem Array.step_iterFromIdxM {m : Type w → Type w'} [Monad m] {β : Type w} {array : Array β} {pos : Nat} :
(array.iterFromIdxM m pos).step = pure
(Std.Shrink.deflate
(if h : pos < array.size then Std.PlausibleIterStep.yield (array.iterFromIdxM m (pos + 1)) array[pos] ⋯
else Std.PlausibleIterStep.done ⋯))
theorem Array.step_iterM {m : Type w → Type w'} [Monad m] {β : Type w} {array : Array β} :
(array.iterM m).step = pure
(Std.Shrink.deflate
(if h : 0 < array.size then Std.PlausibleIterStep.yield (array.iterFromIdxM m 1) array[0] ⋯
else Std.PlausibleIterStep.done ⋯))
theorem Std.Iterators.Types.ArrayIterator.stepAsHetT_iterFromIdxM {m : Type w → Type w'} [Monad m] {β : Type w} [LawfulMonad m] {array : Array β} {pos : Nat} :
(array.iterFromIdxM m pos).stepAsHetT = if x : pos < array.size then pure (IterStep.yield (array.iterFromIdxM m (pos + 1)) array[pos]) else pure IterStep.done
theorem Array.iterFromIdxM_equiv_iterM_drop_toList {α : Type w} {array : Array α} {m : Type w → Type w'} [Monad m] [LawfulMonad m] {pos : Nat} :
(array.iterFromIdxM m pos).Equiv ((List.drop pos array.toList).iterM m)
@[simp]
theorem Array.toList_iterFromIdxM {m : Type w → Type w'} [Monad m] {β : Type w} [LawfulMonad m] {array : Array β} {pos : Nat} :
@[simp]
theorem Array.toArray_iterFromIdxM {m : Type w → Type w'} [Monad m] {β : Type w} [LawfulMonad m] {array : Array β} {pos : Nat} :