| /* | 
|     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; |