@t8/event-patterns
Version:
Lightweight event emitter with flexible event type matching
61 lines (42 loc) • 1.84 kB
text/typescript
import {Event, EventEmitter, type MatchParams} from '.';
let eventEmitter = new EventEmitter();
let x = 0, listener;
console.log('exact event type');
listener = eventEmitter.addListener('update', (event: Event<{dx: number}>) => {
console.assert(event.type === 'update', 'event type should match listener type');
x += event.data.dx;
});
console.assert(eventEmitter._listeners.length === 1, 'added listener');
console.assert(x === 0, 'initial state');
eventEmitter.emit('update', {dx: 1});
console.assert(x === 1, '+1');
eventEmitter.emit('update', {dx: 2});
console.assert(x === 3, '+2');
eventEmitter.emit('update', {dx: -3});
console.assert(x === 0, '-3');
listener.remove();
console.assert(eventEmitter._listeners.length === 0, 'removed listener');
eventEmitter.emit('update', {dx: 5});
console.assert(x === 0, 'no updates, listener is removed');
console.log('event type pattern');
x = 0;
listener = eventEmitter.addListener(/^task\s/, (event: Event<{dx: number}>) => {
x += event.data.dx;
});
console.assert(x === 0, 'initial state');
eventEmitter.emit('task started', {dx: 42});
console.assert(x === 42, 'matching event');
eventEmitter.emit('subtask started', {dx: -42});
console.assert(x === 42, 'non-matching event');
listener.remove();
console.log('event type pattern params');
let p: MatchParams | null | undefined;
listener = eventEmitter.addListener(/^(\S+)\s+(?<status>.+)$/, event => {
p = event.params;
});
console.assert(p === undefined, 'initial state');
eventEmitter.emit('task started', {dx: 42});
console.assert(p?.[0] === 'task' && p?.status === 'started', 'task started');
eventEmitter.emit('subtask completed', {dx: -42});
console.assert(p?.[0] === 'subtask' && p?.status === 'completed', 'subtask completed');
listener.remove();