Module docstring
{}
{}
StateT
      definition
     (σ : Type u) (m : Type u → Type v) (α : Type u) : Type (max u v)
        
      StateT.run
      definition
     {σ : Type u} {m : Type u → Type v} {α : Type u} (x : StateT σ m α) (s : σ) : m (α × σ)
        /--
Executes an action from a monad with added state in the underlying monad `m`. Given an initial
state, it returns a value paired with the final state.
-/
@[always_inline, inline]
def StateT.run {σ : Type u} {m : Type u → Type v} {α : Type u} (x : StateT σ m α) (s : σ) : m (α × σ) :=
  x s
        StateT.run'
      definition
     {σ : Type u} {m : Type u → Type v} [Functor m] {α : Type u} (x : StateT σ m α) (s : σ) : m α
        /--
Executes an action from a monad with added state in the underlying monad `m`. Given an initial
state, it returns a value, discarding the final state.
-/
@[always_inline, inline]
def StateT.run' {σ : Type u} {m : Type u → Type v} [Functor m] {α : Type u} (x : StateT σ m α) (s : σ) : m α :=
  (·.1) <$> x s
        StateM
      definition
     (σ α : Type u) : Type u
        
      instSubsingletonStateM
      instance
     {σ α} [Subsingleton σ] [Subsingleton α] : Subsingleton (StateM σ α)
        instance {σ α} [Subsingleton σ] [Subsingleton α] : Subsingleton (StateM σ α) where
  allEq x y := by
    apply funext
    intro s
    match x s, y s with
    | (a₁, s₁), (a₂, s₂) =>
      rw [Subsingleton.elim a₁ a₂, Subsingleton.elim s₁ s₂]
        StateT.pure
      definition
     (a : α) : StateT σ m α
        
      StateT.bind
      definition
     (x : StateT σ m α) (f : α → StateT σ m β) : StateT σ m β
        /--
Sequences two actions. Typically used via the `>>=` operator.
-/
@[always_inline, inline]
protected def bind (x : StateT σ m α) (f : α → StateT σ m β) : StateT σ m β :=
  fun s => do let (a, s) ← x s; f a s
        StateT.map
      definition
     (f : α → β) (x : StateT σ m α) : StateT σ m β
        
      StateT.instMonad
      instance
     : Monad (StateT σ m)
        @[always_inline]
instance : Monad (StateT σ m) where
  pure := StateT.pure
  bind := StateT.bind
  map  := StateT.map
        StateT.orElse
      definition
     [Alternative m] {α : Type u} (x₁ : StateT σ m α) (x₂ : Unit → StateT σ m α) : StateT σ m α
        
      StateT.failure
      definition
     [Alternative m] {α : Type u} : StateT σ m α
        /--
Fails with a recoverable error. The state is rolled back on error recovery.
-/
@[always_inline, inline]
protected def failure [Alternative m] {α : Type u} : StateT σ m α :=
  fun _ => failure
        StateT.instAlternative
      instance
     [Alternative m] : Alternative (StateT σ m)
        instance [Alternative m] : Alternative (StateT σ m) where
  failure := StateT.failure
  orElse  := StateT.orElse
        StateT.get
      definition
     : StateT σ m σ
        
      StateT.set
      definition
     : σ → StateT σ m PUnit
        
      StateT.modifyGet
      definition
     (f : σ → α × σ) : StateT σ m α
        /--
Applies a function to the current state that both computes a new state and a value. The new state
replaces the current state, and the value is returned.
It is equivalent to `do let (a, s) := f (← StateT.get); StateT.set s; pure a`. However, using
`StateT.modifyGet` may lead to better performance because it doesn't add a new reference to the
state value, and additional references can inhibit in-place updates of data.
-/
@[always_inline, inline]
protected def modifyGet (f : σ → α × σ) : StateT σ m α :=
  fun s => pure (f s)
        StateT.lift
      definition
     {α : Type u} (t : m α) : StateT σ m α
        /--
Runs an action from the underlying monad in the monad with state. The state is not modified.
This function is typically implicitly accessed via a `MonadLiftT` instance as part of [automatic
lifting](lean-manual://section/monad-lifting).
-/
@[always_inline, inline]
protected def lift {α : Type u} (t : m α) : StateT σ m α :=
  fun s => do let a ← t; pure (a, s)
        StateT.instMonadLift
      instance
     : MonadLift m (StateT σ m)
        instance : MonadLift m (StateT σ m) := ⟨StateT.lift⟩
        StateT.instMonadFunctor
      instance
     (σ m) : MonadFunctor m (StateT σ m)
        @[always_inline]
instance (σ m) : MonadFunctor m (StateT σ m) := ⟨fun f x s => f (x s)⟩
        StateT.instMonadExceptOf
      instance
     (ε) [MonadExceptOf ε m] : MonadExceptOf ε (StateT σ m)
        @[always_inline]
instance (ε) [MonadExceptOf ε m] : MonadExceptOf ε (StateT σ m) := {
  throw    := StateT.liftStateT.lift ∘ throwThe ε
  tryCatch := fun x c s => tryCatchThe ε (x s) (fun e => c e s)
}
        ForM.forIn
      definition
     [Monad m] [ForM (StateT β (ExceptT β m)) ρ α] (x : ρ) (b : β) (f : α → β → m (ForInStep β)) : m β
        /--
Creates a suitable implementation of `ForIn.forIn` from a `ForM` instance.
-/
@[always_inline, inline]
def ForM.forIn [Monad m] [ForM (StateT β (ExceptT β m)) ρ α]
    (x : ρ) (b : β) (f : α → β → m (ForInStep β)) : m β := do
  let g a b := .mk do
    match ← f a b with
    | .yield b' => pure (.ok (⟨⟩, b'))
    | .done b' => pure (.error b')
  match ← forM (m := StateT β (ExceptT β m)) (α := α) x g |>.run b |>.run with
  | .ok a => pure a.2
  | .error a => pure a
        instMonadStateOfStateTOfMonad
      instance
     [Monad m] : MonadStateOf σ (StateT σ m)
        instance [Monad m] : MonadStateOf σ (StateT σ m) where
  get       := StateT.get
  set       := StateT.set
  modifyGet := StateT.modifyGet
        StateT.monadControl
      instance
     (σ : Type u) (m : Type u → Type v) [Monad m] : MonadControl m (StateT σ m)
        @[always_inline]
instance StateT.monadControl (σ : Type u) (m : Type u → Type v) [Monad m] : MonadControl m (StateT σ m) where
  stM      := fun α   => α × σ
  liftWith := fun f => do let s ← get; liftM (f (fun x => x.run s))
  restoreM := fun x => do let (a, s) ← liftM x; setset s; pure a
        StateT.tryFinally
      instance
     {m : Type u → Type v} {σ : Type u} [MonadFinally m] [Monad m] : MonadFinally (StateT σ m)
        @[always_inline]
instance StateT.tryFinally {m : Type u → Type v} {σ : Type u} [MonadFinally m] [Monad m] : MonadFinally (StateT σ m) where
  tryFinally' := fun x h s => do
    let ((a, _), (b, s'')) ← tryFinally' (x s) fun
      | some (a, s') => h (some a) s'
      | none         => h none s
    pure ((a, b), s'')