90 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| export default class ChainMap {
 | |
| 
 | |
| 	constructor() {
 | |
| 
 | |
| 		this.weakMap = new WeakMap();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	get( keys ) {
 | |
| 
 | |
| 		if ( Array.isArray( keys ) ) {
 | |
| 
 | |
| 			let map = this.weakMap;
 | |
| 
 | |
| 			for ( let i = 0; i < keys.length; i ++ ) {
 | |
| 
 | |
| 				map = map.get( keys[ i ] );
 | |
| 
 | |
| 				if ( map === undefined ) return undefined;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			return map.get( keys[ keys.length - 1 ] );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			return super.get( keys );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	set( keys, value ) {
 | |
| 
 | |
| 		if ( Array.isArray( keys ) ) {
 | |
| 
 | |
| 			let map = this.weakMap;
 | |
| 
 | |
| 			for ( let i = 0; i < keys.length; i ++ ) {
 | |
| 
 | |
| 				const key = keys[ i ];
 | |
| 
 | |
| 				if ( map.has( key ) === false ) map.set( key, new WeakMap() );
 | |
| 
 | |
| 				map = map.get( key );
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			return map.set( keys[ keys.length - 1 ], value );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			return super.set( keys, value );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	delete( keys ) {
 | |
| 
 | |
| 		if ( Array.isArray( keys ) ) {
 | |
| 
 | |
| 			let map = this.weakMap;
 | |
| 
 | |
| 			for ( let i = 0; i < keys.length; i ++ ) {
 | |
| 
 | |
| 				map = map.get( keys[ i ] );
 | |
| 
 | |
| 				if ( map === undefined ) return false;
 | |
| 
 | |
| 			}
 | |
| 
 | |
| 			return map.delete( keys[ keys.length - 1 ] );
 | |
| 
 | |
| 		} else {
 | |
| 
 | |
| 			return super.delete( keys );
 | |
| 
 | |
| 		}
 | |
| 
 | |
| 	}
 | |
| 
 | |
| 	dispose() {
 | |
| 
 | |
| 		this.weakMap.clear();
 | |
| 
 | |
| 	}
 | |
| 
 | |
| }
 |