Repeatedly call a function on an accelerating schedule while a condition holds (hold-to-repeat, ramping counter).
Use for long-press or hold interactions where the rate of repeats should speed up over time.
Call start() when the user begins holding, and reset() on release or when canRamp becomes false inside the ramp loop.