import 'package:xterm/src/base/disposable.dart'; typedef EventListener = void Function(T event); class Event { final EventEmitter emitter; Event(this.emitter); void call(EventListener listener) { emitter(listener); } } class EventEmitter { final _listeners = >[]; EventSubscription call(EventListener listener) { _listeners.add(listener); return EventSubscription(this, listener); } void emit(T event) { for (final listener in _listeners) { listener(event); } } Event get event => Event(this); } class EventSubscription with Disposable { final EventEmitter emitter; final EventListener listener; EventSubscription(this.emitter, this.listener); @override void dispose() { emitter._listeners.remove(listener); } }