feat: define Array.modify without using Inhabited

This commit is contained in:
Leonardo de Moura 2022-01-14 19:47:42 -08:00
parent 9c5668515c
commit acd482c5f2

View file

@ -117,8 +117,17 @@ def modifyM [Monad m] [Inhabited α] (a : Array α) (i : Nat) (f : α → m α)
pure a
@[inline]
def modify [Inhabited α] (a : Array α) (i : Nat) (f : αα) : Array α :=
Id.run <| a.modifyM i f
unsafe def modifyUnsafe (a : Array α) (i : Nat) (f : αα) : Array α :=
if h : i < a.size then
let idx : Fin a.size := ⟨i, h⟩
let v := a.get idx
let a' := a.set idx (unsafeCast ())
a'.set (size_set a .. ▸ idx) (f v)
else
a
@[implementedBy modifyUnsafe]
constant modify (a : Array α) (i : Nat) (f : αα) : Array α
@[inline]
def modifyOp [Inhabited α] (self : Array α) (idx : Nat) (f : αα) : Array α :=