import React from 'react' export type Subscriber = (e: T) => any type SubscriptionRecord = Record> type MultiSubscriptor = ( e: K, key: string, cb: Subscriber ? ET : never> ) => () => void class Subscription { public subscribers: Record> = {} as Record> private _history: T[] = [] get history(){ return Object.freeze(this._history) } subscribe(key: K, cb: Subscriber) { this.subscribers[key] = cb return () => { delete this.subscribers[key] } } getSubscriber(key: K) { return this.subscribers[key] } removerSubscriber(key: K) { delete this.subscribers[key] } getSubscribersKeys() { return Object.keys(this.subscribers) } invoke(e: T) { this._history.push(e) for (const subscriber in this.subscribers) { this.subscribers[subscriber](e) } } removeAllListeners(){ this.subscribers = {} as Record> } static createSubscriptor(events: SR): MultiSubscriptor { return (e, key, cb) => { return events[e]!.subscribe(key, cb) } } } function useSubscriptionHistory(subscription: Subscription){ const [state, setState] = React.useState(subscription.history) React.useEffect(() => { return subscription.subscribe('subscription-history', e => { setState([...state, e]) }) }, []) return state } export { Subscription, useSubscriptionHistory }