I see what you mean. Still, changing `toString` for this is quite an abuse of the method, considering it's more meant for display use.

Looking at this from a different perspective: `lastChange` isn't a `key`. Yet you are storing it inside the `keyBuffer`. This is making things more complicated than necessary. Maybe you could instead store it as a separate `changeBuffer` on the macroState object. When this chunk of changes is complete, push the keys into the `keyBuffer` individually, and continue with a different chunk.