This PR changes the signature of `Array.set` to take a `Nat`, and a tactic-provided bound, rather than a `Fin`. Corresponding changes (but without the auto-param) for `Array.get` will arrive shortly, after which I'll go more pervasively through the Array API.
18 lines
482 B
Text
18 lines
482 B
Text
import Lean
|
||
|
||
@[inline] private unsafe def mapMonoMImp [Monad m] (as : Array α) (f : α → m α) : m (Array α) :=
|
||
go 0 as
|
||
where
|
||
@[specialize] go (i : Nat) (as : Array α) : m (Array α) := do
|
||
if h : i < as.size then
|
||
let a := as[i]
|
||
let b ← f a
|
||
if ptrEq a b then
|
||
go (i+1) as
|
||
else
|
||
go (i+1) (as.set i b)
|
||
else
|
||
return as
|
||
|
||
set_option trace.Compiler.result true
|
||
run_meta Lean.Compiler.compile #[``mapMonoMImp, ``mapMonoMImp.go]
|