1 | import { Callable } from './types'
|
2 |
|
3 | export function createEmitter() {
|
4 | let events: { [event: string]: Callable[] } = {}
|
5 |
|
6 | function emit(ev: string, ...args: any[]): void {
|
7 | events[ev] ? events[ev].map((fn: Callable) => fn(...args)) : []
|
8 | }
|
9 |
|
10 | function on(ev: string, fn: (...args: any[]) => void) {
|
11 | events[ev] = events[ev] ? events[ev].concat(fn) : [fn]
|
12 | return () => events[ev].splice(events[ev].indexOf(fn), 1)
|
13 | }
|
14 |
|
15 | function clear() {
|
16 | events = {}
|
17 | }
|
18 |
|
19 | function listeners(ev: string) {
|
20 | return events[ev] || []
|
21 | }
|
22 |
|
23 | return {
|
24 | emit,
|
25 | on,
|
26 | clear,
|
27 | listeners,
|
28 | }
|
29 | }
|
30 |
|
31 | export function createEmitHook(name: string, emitter: ReturnType<typeof createEmitter>) {
|
32 | return function hook<T>(props: T) {
|
33 | emitter.emit(name, props)
|
34 | }
|
35 | }
|
36 |
|
37 | export function createOnHook(name: string, emitter: ReturnType<typeof createEmitter>) {
|
38 | return function hook(callback: Callable) {
|
39 | return emitter.on(name, callback)
|
40 | }
|
41 | }
|