import { Action, Pattern, Awaiter } from '../types'; export class Awaiters { public static get Instance() { return this.instance; } private static readonly instance: Awaiters = new Awaiters(); private static consumer(action: Action) { return ({ pattern, resolve }: Awaiter) => { const isMatch = ((action: Action, pattern: Pattern): boolean => { const { type } = action; if (typeof pattern === 'string') { return type === pattern; } if (pattern instanceof RegExp) { return pattern.test(type); } if (typeof pattern === 'function') { return pattern(action); } return false; })(action, pattern); isMatch && resolve(action); return !isMatch; }; } private awaiters: ReadonlyArray>> = []; private constructor() {} public produce

(awaiter: Awaiter) { this.awaiters = [...this.awaiters, awaiter]; return this.awaiters.length; } public consume

(action: Action) { this.awaiters = this.awaiters.filter(Awaiters.consumer(action)); return this.awaiters.length; } } const awaiters = Awaiters.Instance; export default awaiters;