perf: use `update.*!` at `AlphaShareCommon` This PR tries to minimize the number of expressions created at `AlphaShareCommon`.
diff --git a/src/Lean/Meta/Tactic/Grind/AlphaShareCommon.lean b/src/Lean/Meta/Tactic/Grind/AlphaShareCommon.lean index 1891ac6..1057739 100644 --- a/src/Lean/Meta/Tactic/Grind/AlphaShareCommon.lean +++ b/src/Lean/Meta/Tactic/Grind/AlphaShareCommon.lean
@@ -109,18 +109,12 @@ else modify fun { set, map } => { set := set.insert { expr := e }, map } return e - | .app f a => - visit e (return mkApp (← go f) (← go a)) - | .letE n t v b nd => - visit e (return mkLet n t (← go v) (← go b) nd) - | .forallE n d b bi => - visit e (return mkForall n bi (← go d) (← go b)) - | .lam n d b bi => - visit e (return mkLambda n bi (← go d) (← go b)) - | .mdata d b => - visit e (return mkMData d (← go b)) - | .proj n i b => - visit e (return mkProj n i (← go b)) + | .app f a => visit e (return e.updateApp! (← go f) (← go a)) + | .letE _ t v b _ => visit e (return e.updateLetE! (← go t) (← go v) (← go b)) + | .forallE _ d b _ => visit e (return e.updateForallE! (← go d) (← go b)) + | .lam _ d b _ => visit e (return e.updateLambdaE! (← go d) (← go b)) + | .mdata _ b => visit e (return e.updateMData! (← go b)) + | .proj _ _ b => visit e (return e.updateProj! (← go b)) /-- Similar to `shareCommon`, but handles alpha-equivalence. -/ @[inline] def shareCommonAlpha (e : Expr) : AlphaShareCommonM Expr := fun s => @@ -169,17 +163,11 @@ go (e : Expr) : AlphaShareCommonM Expr := do match e with | .bvar .. | .mvar .. | .const .. | .fvar .. | .sort .. | .lit .. => saveInc e - | .app f a => - visitInc e (return mkApp (← go f) (← go a)) - | .letE n t v b nd => - visitInc e (return mkLet n t (← go v) (← go b) nd) - | .forallE n d b bi => - visitInc e (return mkForall n bi (← go d) (← go b)) - | .lam n d b bi => - visitInc e (return mkLambda n bi (← go d) (← go b)) - | .mdata d b => - visitInc e (return mkMData d (← go b)) - | .proj n i b => - visitInc e (return mkProj n i (← go b)) + | .app f a => visitInc e (return e.updateApp! (← go f) (← go a)) + | .letE _ t v b _ => visitInc e (return e.updateLetE! (← go t) (← go v) (← go b)) + | .forallE _ d b _ => visitInc e (return e.updateForallE! (← go d) (← go b)) + | .lam _ d b _ => visitInc e (return e.updateLambdaE! (← go d) (← go b)) + | .mdata _ b => visitInc e (return e.updateMData! (← go b)) + | .proj _ _ b => visitInc e (return e.updateProj! (← go b)) end Lean.Meta.Grind