theorem
Std.Iterators.IterM.dropWhileWithPostcondition_eq_intermediateDropWhileWithPostcondition
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Iterator α m β]
{it : IterM m β}
{P : β → PostconditionT m (ULift Bool)}
 :
theorem
Std.Iterators.IterM.step_intermediateDropWhileWithPostcondition
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[Iterator α m β]
{it : IterM m β}
{P : β → PostconditionT m (ULift Bool)}
{dropping : Bool}
 :
(Intermediate.dropWhileWithPostcondition P dropping it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ =>
      if h' : dropping = true then do
        let __do_lift ← (P out).operation
        match __do_lift with
          | ⟨{ down := true }, h''⟩ =>
            pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileWithPostcondition P true it') ⋯))
          | ⟨{ down := false }, h''⟩ =>
            pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileWithPostcondition P false it') out ⋯))
      else pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileWithPostcondition P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ =>
      pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileWithPostcondition P dropping it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))
theorem
Std.Iterators.IterM.step_dropWhileWithPostcondition
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[Iterator α m β]
{it : IterM m β}
{P : β → PostconditionT m (ULift Bool)}
 :
(dropWhileWithPostcondition P it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ => do
      let __do_lift ← (P out).operation
      match __do_lift with
        | ⟨{ down := true }, h''⟩ =>
          pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileWithPostcondition P true it') ⋯))
        | ⟨{ down := false }, h''⟩ =>
          pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileWithPostcondition P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ =>
      pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileWithPostcondition P true it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))
theorem
Std.Iterators.IterM.step_intermediateDropWhileM
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
[Iterator α m β]
{it : IterM m β}
{P : β → m (ULift Bool)}
{dropping : Bool}
 :
(Intermediate.dropWhileM P dropping it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ =>
      if h' : dropping = true then do
        let __do_lift ← P out
        match __do_lift with
          | { down := true } => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileM P true it') ⋯))
          | { down := false } =>
            pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileM P false it') out ⋯))
      else pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileM P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ =>
      pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileM P dropping it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))
theorem
Std.Iterators.IterM.step_dropWhileM
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
[Iterator α m β]
{it : IterM m β}
{P : β → m (ULift Bool)}
 :
(dropWhileM P it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ => do
      let __do_lift ← P out
      match __do_lift with
        | { down := true } => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileM P true it') ⋯))
        | { down := false } =>
          pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhileM P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhileM P true it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))
theorem
Std.Iterators.IterM.step_intermediateDropWhile
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
[Iterator α m β]
{it : IterM m β}
{P : β → Bool}
{dropping : Bool}
 :
(Intermediate.dropWhile P dropping it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ =>
      if h' : dropping = true then
        match P out with
        | true => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhile P true it') ⋯))
        | false => pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhile P false it') out ⋯))
      else pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhile P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhile P dropping it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))
theorem
Std.Iterators.IterM.step_dropWhile
{α : Type u_1}
{m : Type u_1 → Type u_2}
{β : Type u_1}
[Monad m]
[LawfulMonad m]
[Iterator α m β]
{it : IterM m β}
{P : β → Bool}
 :
(dropWhile P it).step = do
  let __do_lift ← it.step
  match __do_lift.inflate with
    | ⟨IterStep.yield it' out, h⟩ =>
      match P out with
      | true => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhile P true it') ⋯))
      | false => pure (Shrink.deflate (PlausibleIterStep.yield (Intermediate.dropWhile P false it') out ⋯))
    | ⟨IterStep.skip it', h⟩ => pure (Shrink.deflate (PlausibleIterStep.skip (Intermediate.dropWhile P true it') ⋯))
    | ⟨IterStep.done, h⟩ => pure (Shrink.deflate (PlausibleIterStep.done ⋯))