UNPKG

945 BPlain TextView Raw
1import { Callable } from './types'
2
3export 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
31export function createEmitHook(name: string, emitter: ReturnType<typeof createEmitter>) {
32 return function hook<T>(props: T) {
33 emitter.emit(name, props)
34 }
35}
36
37export function createOnHook(name: string, emitter: ReturnType<typeof createEmitter>) {
38 return function hook(callback: Callable) {
39 return emitter.on(name, callback)
40 }
41}