There are “key combos” like Lemur handles which is “pressing more than one key at the SAME TIME”. And there are “key combos” like fighting games have where pressing A A B A Down Up in sequence does a special move.
Lemur doesn’t handle those kinds of combos and handling them in a general way is fraught with peril.
When you think of something simple like a mouse click, even that is not so simple. Is it time between the presses? Time between the releases? Is there a period of time for the first pressed where the release doesn’t count anymore?
With things like “push forward twice to run” it’s even trickier. How far forward? How far back again? Do you time the peaks? The valleys? Both?
So to me it’s better for user code to handle this. It can still be done functionally… just not necessarily with “function IDs”.
For example, register an AnalogFunctionListener with the forward axis. Have that delegate to a StateFunctionListener that means “run” whenever the run conditions are met.
Granted, it’s not exactly as nice as just registering StateFunctionListener to F_RUN… but it’s not that different in the game code.