Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | 148x 148x 60x 60x 60x 56x 32x 56x 208x 208x 36x 36x 64x 32x 60x 92x 92x 56x 44x 12x 12x 16x | export class Hooks { constructor(hooks = []) { this.defaultHook = (v) => v return this.setHooks(hooks) } // chainables parse(hooks = []) { const _hookList = Array.isArray(hooks) ? hooks : [] for (let _hook of _hookList) { if (this.isProperHook(_hook)) { this.hooks.push(_hook) } } return this } addHook(hook) { if (this.isProperHook(hook) && this.isNewHook(hook)) { this.hooks.push(hook) } return this } setHooks(hooks = []) { this.hooks = hooks.filter(this.isProperHook) return this } setDefault(hook) { this.defaultHook = hook return this } // not chainables isProperHook(hook) { return hook && typeof hook === 'object' && typeof hook.handler === 'function' } isNewHook(hook) { return this.hooks.findIndex((h) => h === hook) < 0 } getHooks() { return this.hooks } empty() { return this.hooks.length === 0 } apply(value, options) { if (this.empty()) { return this.defaultHook(value, options) } else { return this.hooks.reduce((result, hook) => hook.handler(result, options), value) } } asSingleHook() { const self = this return { handler(value, options) { return self.apply(value, options) }, } } } |