It’s probably just that one-shots are not that commonly needed in firmware. Even switch debouncing can be done inside a standard timed main() loop.
Here is pseudocode for a (retriggerable) one shot:
timer = 0
triggered = false
oneShotActive = false
LOOP:
if (triggered)
{
triggered = false;
timer = ONE_SHOT_TIMEOUT
oneShotActive = true
}
else if (timer > 0)
{
timer--
}
else if (timer == 0)
{
oneShotActive = false
}
ENDLOOP:
[edit: fixed a bug]