I've recently experimented with using functional reactive programming to handle the events of a game. I've found it allows for a greater degree of abstraction than an event loop with callbacks, in the same way that higher-level functions like map/filter/reduce provide an abstraction over iteration.