File: //var/www/aspa/three/addons/renderers/common/ChainMap.js
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();
	}
}