Queue Animation Emitter
A QueueListenerIfc that emits an AnimationEvent.QueueLengthChanged whenever a queue's length changes. Registering one on a queue (queue.addQueueListener(QueueAnimationEmitter())) is the non-intrusive way to animate that queue — the queue itself is unchanged.
The emitter reads everything it needs from the queue passed to update: the current Queue.size (the queue notifies its listeners after applying the enqueue/dequeue/clear, so the size is already up to date), the queue's name, the current simulated time, and the model's animation sink. It therefore holds no reference to the model and can be attached to any queue.
It de-duplicates by remembering the last length emitted, so notifications that do not actually change the length (e.g. an "ignored" pass-through) produce no event.
Parameters
the queued object type