{"version":3,"sources":["auto_map.ts"],"sourcesContent":["\n// extends Map class to automatically create new empty entries when the getAuto() method is called and the entry does not exist\n\nimport type { any_class } from \"./global_types.ts\";\n\nconst DEFAULT_CLASS = Symbol('DEFAULT_CLASS')\nconst DEFAULT_IS_CLASS = Symbol('DEFAULT_IS_CLASS')\nconst DEFAULT_CLASS_PRIMITIVE = Symbol('DEFAULT_CLASS_PRIMITIVE')\nconst DEFAULT_CREATOR_FUNCTION = Symbol('DEFAULT_CREATOR_FUNCTION')\nconst DEFAULT_VALUE = Symbol('DEFAULT_VALUE')\n\nexport type AutoMap<K,V> = Map<K,V> & {\n    getAuto(key: K): V;\n    enableAutoRemove(): AutoRemoveMap<K,V> & AutoMap<K,V>\n}\n\n// TODO\ndeclare global {\n    interface Map<K, V> {\n        setAutoDefault(default_class_or_creator_function_or_value:V|any_class<V>|(()=>V)):AutoMap<K, V>;\n    }\n}\n\n\nMap.prototype.setAutoDefault = function<V>(default_class_or_creator_function_or_value:V|any_class<V>|(()=>V)) {\n    // is class\n    if (typeof default_class_or_creator_function_or_value === \"function\" && default_class_or_creator_function_or_value.prototype !== undefined) {\n        this[DEFAULT_CLASS] = <any_class<V>>default_class_or_creator_function_or_value;\n        this[DEFAULT_IS_CLASS] = true;\n        this[DEFAULT_CLASS_PRIMITIVE] = this[DEFAULT_CLASS] == String || this[DEFAULT_CLASS] == Number  || this[DEFAULT_CLASS] == BigInt || this[DEFAULT_CLASS] == Boolean;\n    }\n    // is function\n    else if (typeof default_class_or_creator_function_or_value === \"function\") {\n        this[DEFAULT_CREATOR_FUNCTION] = <(()=>V)> default_class_or_creator_function_or_value;\n    }\n    // is value\n    else this[DEFAULT_VALUE] = <V>default_class_or_creator_function_or_value;\n    return this;\n}\n\n\nclass AutoRemoveMap<K, V> extends Map<K, V> {\n    constructor(entries?: readonly (readonly [K, V])[] | null) {\n        super(entries);\n        for (const [key, value] of this) {\n            this.#enableAutoRemove(key, value);\n        }\n    }\n\n    set(key: K, value: V) {\n        this.#enableAutoRemove(key, value);\n        return super.set(key, value);\n    }\n\n    #enableAutoRemove(mapKey: K, value: V) {\n        if (value instanceof Set || value instanceof Map) {\n            const originalDelete = value.delete.bind(value);\n            value.delete = (key: K) => {\n                const res = originalDelete(key);\n                if (value.size == 0) this.delete(mapKey);\n                return res;\n            }\n        }\n        else {\n            throw new Error(\"auto remove not implemented for this type of value\")\n        }\n        // TODO: more types\n    }\n}\n\nMap.prototype.enableAutoRemove = function() {\n    const map = new AutoRemoveMap([...this.entries()]);\n\n    if ((this as any)[DEFAULT_CLASS]) (map as any)[DEFAULT_CLASS] = (this as any)[DEFAULT_CLASS]\n    if ((this as any)[DEFAULT_IS_CLASS]) (map as any)[DEFAULT_IS_CLASS] = (this as any)[DEFAULT_IS_CLASS]\n    if ((this as any)[DEFAULT_CLASS_PRIMITIVE]) (map as any)[DEFAULT_CLASS_PRIMITIVE] = (this as any)[DEFAULT_CLASS_PRIMITIVE]\n    if ((this as any)[DEFAULT_CREATOR_FUNCTION]) (map as any)[DEFAULT_CREATOR_FUNCTION] = (this as any)[DEFAULT_CREATOR_FUNCTION]\n    if ((this as any)[DEFAULT_VALUE]) (map as any)[DEFAULT_VALUE] = (this as any)[DEFAULT_VALUE]\n\n    return map;\n}\n\n\nMap.prototype.getAuto = function<K,V>(key: K): V {\n    if (!this.has(key)) this.set(key, \n        this[DEFAULT_CREATOR_FUNCTION] ? \n            this[DEFAULT_CREATOR_FUNCTION]() : \n            (this[DEFAULT_IS_CLASS] ? \n                (this[DEFAULT_CLASS_PRIMITIVE] ?\n                    (this[DEFAULT_CLASS_PRIMITIVE] == BigInt ?\n                    (<((n:number) => V)>this[DEFAULT_CLASS])(0) : \n                    (<(() => V)>this[DEFAULT_CLASS])()) : \n                    new (<(new () => V)>this[DEFAULT_CLASS])()) : \n                this[DEFAULT_VALUE]\n            )\n    );\n    return this.get(key);\n}"],"names":["DEFAULT_CLASS","Symbol","DEFAULT_IS_CLASS","DEFAULT_CLASS_PRIMITIVE","DEFAULT_CREATOR_FUNCTION","DEFAULT_VALUE","Map","prototype","setAutoDefault","default_class_or_creator_function_or_value","undefined","String","Number","BigInt","Boolean","AutoRemoveMap","constructor","entries","key","value","set","mapKey","Set","originalDelete","delete","bind","res","size","Error","enableAutoRemove","map","getAuto","has","get"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/utils/","file":"auto_map.ts"}