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();
 | 
						|
 | 
						|
	}
 | 
						|
 | 
						|
}
 |