import { createLogger } from '../debug/create-logger'; import { LOG_LEVEL } from '../debug/levels'; export interface MyCallback { displayName?: string; (param: Argument): void|undefined|boolean; } const sill = createLogger(LOG_LEVEL.SILLY, 'cb-list'); export class CallbackList { protected list: MyCallback[] = []; add(item: MyCallback, name?: string) { if (name) { Object.defineProperty(item, 'displayName', { value: name, enumerable: true, writable: true, configurable: true, }); } return this.list.push(item); } remove(item: MyCallback) { const found = this.list.indexOf(item); if (found !== -1) { return this.list.splice(found, 1); } } run(argument: Argument) { return this.list.some((cb, i) => { let ret = cb(argument); ret = ret === undefined? true : !!ret; sill('%s/%s (%s)- %s', i, this.list.length, cb.displayName || cb.name, ret); return ret; }); } }