theorem
Std.Iterators.Iter.forIn_eq_forIn_toIterM
{α β : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w''}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
{γ : Type w}
{it : Iter β}
{init : γ}
{f : β → γ → m (ForInStep γ)}
:
theorem
Std.Iterators.Iter.forIn_eq_match_step
{α β : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w''}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
{γ : Type w}
{it : Iter β}
{init : γ}
{f : β → γ → m (ForInStep γ)}
:
forIn it init f = match it.step with
| ⟨IterStep.yield it' out, property⟩ => do
let __do_lift ← f out init
match __do_lift with
| ForInStep.yield c => forIn it' c f
| ForInStep.done c => pure c
| ⟨IterStep.skip it', property⟩ => forIn it' init f
| ⟨IterStep.done, property⟩ => pure init
theorem
Std.Iterators.Iter.forIn_toList
{α β : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w''}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
[IteratorCollect α Id Id]
[LawfulIteratorCollect α Id Id]
{γ : Type w}
{it : Iter β}
{init : γ}
{f : β → γ → m (ForInStep γ)}
:
theorem
Std.Iterators.Iter.forIn_yield_eq_foldM
{α β γ δ : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w''}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
{f : β → γ → m δ}
{g : β → γ → δ → γ}
{init : γ}
{it : Iter β}
:
theorem
Std.Iterators.Iter.foldM_eq_match_step
{α β γ : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
{f : γ → β → m γ}
{init : γ}
{it : Iter β}
:
foldM f init it = match it.step with
| ⟨IterStep.yield it' out, property⟩ => do
let __do_lift ← f init out
foldM f __do_lift it'
| ⟨IterStep.skip it', property⟩ => foldM f init it'
| ⟨IterStep.done, property⟩ => pure init
theorem
Std.Iterators.Iter.foldlM_toList
{α β γ : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w'}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
[IteratorCollect α Id Id]
[LawfulIteratorCollect α Id Id]
{f : γ → β → m γ}
{init : γ}
{it : Iter β}
:
theorem
Std.Iterators.IterM.forIn_eq_foldM
{α β : Type w}
[Iterator α Id β]
[Finite α Id]
{m : Type w → Type w''}
[Monad m]
[LawfulMonad m]
[IteratorLoop α Id m]
[LawfulIteratorLoop α Id m]
[IteratorCollect α Id Id]
[LawfulIteratorCollect α Id Id]
{γ : Type w}
{it : Iter β}
{init : γ}
{f : β → γ → m (ForInStep γ)}
:
forIn it init f = ForInStep.value <$> Iter.foldM
(fun (c : ForInStep γ) (b : β) =>
match c with
| ForInStep.yield c => f b c
| ForInStep.done c => pure (ForInStep.done c))
(ForInStep.yield init) it
@[simp]
theorem
Std.Iterators.Iter.forIn_pure_yield_eq_fold
{α β γ : Type w}
[Iterator α Id β]
[Finite α Id]
[IteratorLoop α Id Id]
[LawfulIteratorLoop α Id Id]
{f : β → γ → γ}
{init : γ}
{it : Iter β}
:
theorem
Std.Iterators.Iter.fold_eq_match_step
{α β γ : Type w}
[Iterator α Id β]
[Finite α Id]
[IteratorLoop α Id Id]
[LawfulIteratorLoop α Id Id]
{f : γ → β → γ}
{init : γ}
{it : Iter β}
:
fold f init it = match it.step with
| ⟨IterStep.yield it' out, property⟩ => fold f (f init out) it'
| ⟨IterStep.skip it', property⟩ => fold f init it'
| ⟨IterStep.done, property⟩ => init
theorem
Std.Iterators.Iter.foldl_toList
{α β γ : Type w}
[Iterator α Id β]
[Finite α Id]
[IteratorLoop α Id Id]
[LawfulIteratorLoop α Id Id]
[IteratorCollect α Id Id]
[LawfulIteratorCollect α Id Id]
{f : γ → β → γ}
{init : γ}
{it : Iter β}
: