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 (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;