The event-based state machine analogy is surprisingly accurate - also for the Key Presser. It's because a "key" on the computer is not quite a boolean - at the OS level it's a sequence of "press" & "release" events. For example it's possible for a key to be "pressed" three times in a row, and then "released" once. Internally, most apps follow the Schmitt trigger model and maintain an internal boolean as the key state - but not always. And this can be used to trigger some fun edge-cases in many games - like faster movement or higher fire rate. The games can get pretty confused if the "release" events don't match up with "press"-es 🙂
Also fun - if you go even deeper, on the HID level, it's a mix of the two models. The keyboards sometimes report state transitions (pressed => released & vice versa) and sometimes they dump the full key state (list of pressed keys). All depends on the whims of the firmware. At the deepest level it's obviously just logic voltage levels.
Source: I'm also developing a tiny hand-held keyboard
https://github.com/mafik/keyer - hopefully one day it'll run Automat on it :P