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]