/**
 * @template K1
 * @template K2
 * @template V
 */
export class MMap {
    constructor() {
        /**
         * @type {Map<K1, Map<K2, V>>}
         */
        this._map = new Map();
    }

    /**
     * 获取指定键的值
     * @param {K1} key1 - 第一层键
     * @param {K2} key2 - 第二层键
     * @returns {V | undefined} - 返回对应的值，如果不存在则返回 undefined
     */
    get(key1, key2) {
        const map2 = this._map.get(key1);
        if (!map2) {
            return undefined;
        }
        const value = map2.get(key2);
        return value;
    }

    /**
     * 设置指定键的值
     * @param {K1} key1 - 第一层键
     * @param {K2} key2 - 第二层键
     * @param {V} value - 要设置的值
     */
    set(key1, key2, value) {
        let map2 = this._map.get(key1);
        if (!map2) {
            map2 = new Map();
            this._map.set(key1, map2);
        }

        map2.set(key2, value);
    }
}