| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Tobias Koppers @sokra |
| */ |
| "use strict"; |
| |
| class HookMap { |
| constructor(factory) { |
| this._map = new Map(); |
| this._factory = factory; |
| this._interceptors = []; |
| } |
| |
| get(key) { |
| return this._map.get(key); |
| } |
| |
| for(key) { |
| const hook = this.get(key); |
| if (hook !== undefined) { |
| return hook; |
| } |
| let newHook = this._factory(key); |
| const interceptors = this._interceptors; |
| for (let i = 0; i < interceptors.length; i++) { |
| newHook = interceptors[i].factory(key, newHook); |
| } |
| this._map.set(key, newHook); |
| return newHook; |
| } |
| |
| intercept(interceptor) { |
| this._interceptors.push( |
| Object.assign( |
| { |
| factory: (key, hook) => hook |
| }, |
| interceptor |
| ) |
| ); |
| } |
| |
| tap(key, options, fn) { |
| return this.for(key).tap(options, fn); |
| } |
| |
| tapAsync(key, options, fn) { |
| return this.for(key).tapAsync(options, fn); |
| } |
| |
| tapPromise(key, options, fn) { |
| return this.for(key).tapPromise(options, fn); |
| } |
| } |
| |
| module.exports = HookMap; |