/-!
This benchmark exercises
* general elaboration, likely from many nested lambdas
* code generation, ditto
-/

set_option maxRecDepth 10000

def addALot (x: Nat) : StateM Nat Nat := do
  set x
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  modifyGet (λ y => ((), y + x))
  let y <- get
  pure y

#eval StateT.run' (addALot 2) 0
