event.dart 835 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import 'package:xterm/src/base/disposable.dart';
  2. typedef EventListener<T> = void Function(T event);
  3. class Event<T> {
  4. final EventEmitter<T> emitter;
  5. Event(this.emitter);
  6. void call(EventListener<T> listener) {
  7. emitter(listener);
  8. }
  9. }
  10. class EventEmitter<T> {
  11. final _listeners = <EventListener<T>>[];
  12. EventSubscription<T> call(EventListener<T> listener) {
  13. _listeners.add(listener);
  14. return EventSubscription(this, listener);
  15. }
  16. void emit(T event) {
  17. for (final listener in _listeners) {
  18. listener(event);
  19. }
  20. }
  21. Event<T> get event => Event(this);
  22. }
  23. class EventSubscription<T> with Disposable {
  24. final EventEmitter<T> emitter;
  25. final EventListener<T> listener;
  26. EventSubscription(this.emitter, this.listener);
  27. @override
  28. void dispose() {
  29. emitter._listeners.remove(listener);
  30. }
  31. }