-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
to.ts
30 lines (28 loc) 路 962 Bytes
/
to.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import type { Operator } from "../lib/types/index.ts";
/*
NOTE: Here we allow a tiny memory leak to be able to emulate
the EventEmitter.removeListener(event, callback) method easily.
evt.getHandlers()
.filter(handler => (
handler.callback === callback &&
handler.op === to("event1")
))
.forEach(handler => handler.detach());
*/
const map = new Map<string, ReturnType<typeof to>>();
/**
* Operator that helps emulate an EventEmitter with EVT
* See https://stackblitz.com/edit/evt-honvv3?file=index.ts
* or https://docs.evt.land/extending_evt
* */
export const to = <T extends readonly [string, any], K extends T[0]>(
eventName: K
): Operator.f位.Stateless<T, (Extract<T, readonly [K, any]> extends never ? T : Extract<T, readonly [K, any]>)[1]> =>
map.get(eventName) ?? (
map.set(
eventName,
data => data[0] !== eventName ? null : [data[1]]
),
to(eventName)
)
;