UNPKG

@ayka/domistrukt

Version:

A TypeScript library for creating structured data objects with ease.

1 lines 61.4 kB
{"version":3,"sources":["../src/Main.ts","../src/Lib.ts","../src/Strukt.ts","../src/StruktBase.ts","../src/Switch.ts","../src/Error.ts","../src/Errors.ts","../src/DispatchMap.ts","../src/Enum.ts","../src/FlatObject.ts"],"sourcesContent":["export * from './Lib.ts';\nexport * as Lib from './Lib.ts';\n\nexport * as Strukt from './Strukt.ts';\nexport { init, initBasic, isStrukt, isBasicStrukt } from './Strukt.ts';\nexport type { params } from './Strukt.ts';\n\nexport * as StruktBase from './StruktBase.ts';\nexport { StruktBase as Base, BasicStrukt as Basic } from './StruktBase.ts';\n\nexport * as Switch from './Switch.ts';\nexport { switchCase, compileSwitch } from './Switch.ts';\n\nexport * as Error from './Error.ts';\nexport { init as error, staticError, isErrorStrukt } from './Error.ts';\nexport type { params as errorParams } from './Error.ts';\n\nexport * as Errors from './Errors.ts';\n\nexport * as FlatObject from './FlatObject.ts';\nexport {\n\ttoFlatObject,\n\tcopy,\n\tisTrueObject,\n\tflatObject as initFlatObject,\n\ttype FlatObject as flatObject,\n} from './FlatObject.ts';\n\nexport * as DispatchMap from './DispatchMap.ts';\nexport { init as dispatchMap } from './DispatchMap.ts';\n\nexport * as Enum from './Enum.ts';\nexport { init as initEnum } from './Enum.ts';\n\nexport type * as Types from './Types/Types.d.ts';\nexport type { classArgs, classArgs1, classArgsN } from './Types/Types.d.ts';\n","import type * as T from './Types/Types.d.ts';\n\n/**\n * Creates a class constructor type with no arguments.\n * @template t - The type of the instance created by the constructor.\n * @returns {T.klass<[], t>} A class constructor type.\n */\nexport const klass = <t>(): T.klass<[], t> => class {} as any;\n\n/**\n * Selects specified keys from a target object in a type-safe manner.\n *\n * @template t - The type of the target object.\n * @template key - The type of the keys to select, extending keyof t.\n * @param {t} target - The target object to select keys from.\n * @param {Iterable<key>} keys - An iterable of keys to select.\n * @returns {{ [key in key]: t[key] }} An object with the selected keys and their values.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * const result = selectKeys(obj, ['a', 'c']);\n * console.log(result); // Output: { a: 1, c: 3 }\n *\n * @example\n * class Person {\n * constructor(public name: string, public age: number, private ssn: string) {}\n * toObject() {\n * return selectKeys(this, ['name', 'age']);\n * }\n * }\n * const person = new Person('John', 30, '123-45-6789');\n * const result = person.toObject();\n * console.log(result); // Output: { name: 'John', age: 30 }\n */\nexport const selectKeys = <t, key extends keyof t = keyof t>(\n\ttarget: t,\n\tkeys: Exclude<Iterable<key>, string>,\n): { -readonly [k in key]: t[k] } => {\n\tconst result: any = {};\n\n\tfor (const key of keys) {\n\t\tresult[key] = target[key];\n\t}\n\n\treturn result;\n};\n\n/**\n * Creates a function that initializes an instance of a given class.\n *\n * @template k - The type of the class constructor.\n * @param {k} klass - The class constructor to create an initializer for.\n * @returns {(...params: ConstructorParameters<k>) => InstanceType<k>} A function that takes constructor parameters and returns a new instance of the class.\n *\n * @example\n * class Person {\n * constructor(public name: string, public age: number) {}\n * }\n *\n * const initPerson = makeConstructor(Person);\n * const john = initPerson('John', 30);\n * console.log(john); // Person { name: 'John', age: 30 }\n */\nexport const makeConstructor =\n\t<k extends T.klass>(klass: k) =>\n\t(...params: ConstructorParameters<k>): InstanceType<k> =>\n\t\tReflect.construct(klass, params);\n\nconst defineGetter = <t>(target: t, key: keyof t, value: any) => {\n\tObject.defineProperty(target, key, {\n\t\tget() {\n\t\t\treturn value;\n\t\t},\n\t});\n};\n\n/**\n * Redefines specified properties of an object as accessors (getters and setters).\n * This function mutates the original object and returns it.\n * The redefined properties will behave like normal properties when accessed or modified,\n * but they will be implemented as getters and setters internally.\n * This is useful for hiding properties from console.log, as they will be printed as [Getter/Setter].\n *\n * @template t - The type of the target object.\n * @template key - The type of the keys to be redefined, must be a subset of keyof t.\n * @param {t} target - The object whose properties are to be redefined.\n * @param {Iterable<key>} props - An iterable of property names to be redefined as accessors.\n * @returns {t} The modified target object.\n *\n * @example\n * const obj = { a: 1, b: 2, c: 3 };\n * redefineAsAccessors(obj, ['a', 'b']);\n * console.log(obj); // Outputs: { a: [Getter/Setter], b: [Getter/Setter], c: 3 }\n * obj.a = 4;\n * console.log(obj.a); // Outputs: 4\n * console.log(Object.getOwnPropertyDescriptor(obj, 'a')); // Shows getter and setter\n */\nexport const redefineAsAccessors = <t, key extends keyof t>(\n\ttarget: t,\n\tprops: Iterable<key>,\n) => {\n\tfor (const key of props) {\n\t\tconst value = target[key];\n\t\tdefineGetter(target, key, value);\n\n\t\tObject.defineProperty(target, key, {\n\t\t\tset(newValue) {\n\t\t\t\tdefineGetter(target, key, newValue);\n\t\t\t},\n\t\t});\n\t}\n\n\treturn target;\n};\n\n/**\n * Options for the lazy decorator.\n * @typedef {Object} lazyOpts\n * @property {boolean} - Whether to use a value property instead of a getter/setter.\n * @property {boolean} - Whether the property is configurable.\n * @property {boolean} - Whether the property is enumerable.\n * @property {boolean} - Whether the property is writable.\n */\nexport type lazyOpts = {\n\tuseValue?: boolean;\n\tconfigurable?: boolean;\n\tenumerable?: boolean;\n\twritable?: boolean;\n};\n\n/**\n * A decorator that lazily initializes a property.\n * @param {lazyOpts} [opts] - Options for the lazy initialization.\n * @returns {PropertyDecorator} A property decorator function.\n *\n * @example\n * class Example {\n * @lazy()\n * get expensiveValue() {\n * console.log('Calculating...');\n * return 42;\n * }\n * }\n *\n * const instance = new Example();\n * console.log(instance.expensiveValue); // Logs \"Calculating...\" then \"42\"\n * console.log(instance.expensiveValue); // Logs \"42\" without recalculating\n */\nexport const lazy = (opts?: lazyOpts) => {\n\tconst {\n\t\tuseValue = true,\n\t\tconfigurable = true,\n\t\twritable = true,\n\t\tenumerable = true,\n\t} = opts ?? {};\n\n\treturn (\n\t\t_target: any,\n\t\tpropertyKey: PropertyKey,\n\t\tdescriptor: PropertyDescriptor,\n\t) => {\n\t\tif (descriptor.get == null) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst fn = descriptor.get;\n\n\t\tdescriptor.get = function lazy() {\n\t\t\tlet value = fn.call(this);\n\n\t\t\tconst property = useValue\n\t\t\t\t? {\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t\twritable,\n\t\t\t\t\t\tenumerable,\n\t\t\t\t\t\tconfigurable,\n\t\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\t\tget() {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tset(newValue: any) {\n\t\t\t\t\t\t\tvalue = newValue;\n\t\t\t\t\t\t},\n\t\t\t\t\t\tconfigurable,\n\t\t\t\t\t\tenumerable,\n\t\t\t\t\t};\n\n\t\t\tObject.defineProperty(this, propertyKey, property);\n\n\t\t\treturn value;\n\t\t};\n\t};\n};\n\nexport const promiseObject = async <\n\tshape extends { [key: string]: Promise<any> },\n>(\n\tpromiseShape: shape,\n): Promise<{ [k in keyof shape]: Awaited<shape[k]> }> => {\n\tconst promises = Object.entries(promiseShape).map(([key, promise]) =>\n\t\tpromise.then((value) => [key, value]),\n\t);\n\n\tconst entries = await Promise.all(promises);\n\n\treturn Object.fromEntries(entries) as any;\n};\n","// import * as Lib from './Lib.ts';\nimport * as StruktBase from './StruktBase.ts';\nimport type * as T from './Types/Types.d.ts';\n\n/**\n * Parameters for initializing a Strukt.\n * @template constructor - The constructor type.\n * @property {constructor} constructor - The constructor function.\n * @property {(keyof ReturnType<constructor>)[]} [hidden] - Optional keys to be hidden.\n */\nexport type params<constructor extends T.anyConstructor> = {\n\tconstructor: constructor;\n\thidden?: (keyof ReturnType<constructor>)[];\n};\n\nexport type basicStruktClass<constructor extends T.anyConstructor> = {\n\tnew (\n\t\t...params: Parameters<constructor>\n\t): StruktBase.BasicStrukt & ReturnType<constructor>;\n};\n\nexport type struktClass<constructor extends T.anyConstructor> = {\n\tnew (\n\t\t...params: Parameters<constructor>\n\t): StruktBase.t<Parameters<constructor>, ReturnType<constructor>> &\n\t\tReturnType<constructor>;\n};\n\n// export const defaults = {};\n\n/**\n * Initializes a Strukt class.\n * @template constructor - The constructor type.\n * @param {params<constructor>} params - The parameters for initialization.\n * @returns {struktClass<constructor>} The initialized Strukt class.\n * @example\n * class MyClass extends init({\n * constructor (args: { x: number, y: number }) {\n * return {\n * x: args.x,\n * y: args.y,\n * sum: args.x + args.y\n * };\n * },\n * hidden: ['sum']\n * }) {}\n * const instance = new MyClass({ x: 1, y: 2 });\n * console.log(instance); // Output: MyClass { x: 1, y: 2, sum: 3 }\n */\nexport const init = <constructor extends T.anyConstructor>(\n\tparams: params<constructor>,\n): struktClass<constructor> => {\n\ttype args = Parameters<constructor>;\n\ttype output = ReturnType<constructor>;\n\n\tconst constructorFn: constructor = params.constructor;\n\tconst hidden = params.hidden ?? [];\n\n\tclass Strukt extends StruktBase.t<args, output> {\n\t\tconstructor(...args: args) {\n\t\t\tconst data = constructorFn(...args) as output;\n\t\t\tsuper({ data, hidden });\n\t\t}\n\t}\n\n\treturn Strukt as struktClass<constructor>;\n};\n\nexport const initBasic = <constructor extends T.anyConstructor>(\n\tparams: params<constructor>,\n): basicStruktClass<constructor> => {\n\ttype args = Parameters<constructor>;\n\ttype output = ReturnType<constructor>;\n\n\tconst constructorFn: constructor = params.constructor;\n\tconst hidden = params.hidden ?? [];\n\n\tclass Strukt extends StruktBase.BasicStrukt {\n\t\tconstructor(...args: args) {\n\t\t\tconst data = constructorFn(...args) as output;\n\t\t\tsuper({ data, hidden });\n\t\t}\n\t}\n\n\treturn Strukt as struktClass<constructor>;\n};\n\nexport const isStrukt = (value: unknown): value is StruktBase.t<any, any> =>\n\tvalue instanceof StruktBase.t;\n\nexport const isBasicStrukt = (\n\tvalue: unknown,\n): value is StruktBase.BasicStrukt => value instanceof StruktBase.BasicStrukt;\n","import * as Im from 'immutable';\n// import * as Errors from './Errors.ts';\nimport * as Lib from './Lib.ts';\nimport type * as T from './Types/Types.d.ts';\n\nexport type params<data extends T.anyObject> = {\n\t// args: args;\n\tdata: data;\n\thidden: readonly PropertyKey[];\n};\n\nexport type constructParams = {\n\ttarget: T.anyObject;\n\tdata: T.anyObject;\n\thidden: readonly PropertyKey[];\n};\n\n/**\n * Constructs an object by copying data and redefining hidden properties as accessors.\n * @param params - The parameters for construction.\n * @returns The constructed target object.\n */\nexport const construct = (params: constructParams) => {\n\t// removes prototype\n\tconst data = { ...params.data };\n\tReflect.deleteProperty(data, '__proto__');\n\tObject.assign(params.target, data);\n\tLib.redefineAsAccessors(params.target, params.hidden);\n\n\treturn params.target;\n};\n\nexport class BasicStrukt {\n\tconstructor(params: params<any>) {\n\t\tconstruct({\n\t\t\ttarget: this,\n\t\t\tdata: params.data,\n\t\t\thidden: params.hidden,\n\t\t});\n\t}\n}\n\n/**\n * Base class for Strukt.\n * @template args - The type of arguments.\n * @template data - The type of data.\n */\nexport class StruktBase<\n\targs extends T.anyArgs,\n\tdata extends T.anyObject,\n> extends BasicStrukt {\n\treadonly #dataKeys: Im.List<keyof data>;\n\treadonly #hidden: readonly PropertyKey[];\n\n\tconstructor(params: params<data>) {\n\t\tsuper(params);\n\t\tthis.#dataKeys = Im.List(Object.keys(params.data) as any);\n\t\tthis.#hidden = [...params.hidden];\n\t}\n\n\t/**\n\t * Gets the type of arguments.\n\t * @returns The type of arguments.\n\t */\n\tget $$argsT(): args {\n\t\t// @ts-expect-error\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Gets the first argument type.\n\t * @returns The first argument type.\n\t */\n\tget $$args1T(): args[0] {\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Gets the type of data returned by the constructor.\n\t * @returns The type of data.\n\t */\n\tget $$dataT(): data {\n\t\t// @ts-expect-error\n\t\treturn undefined;\n\t}\n\n\t/**\n\t * Retrieves the keys of the data returned by the constructor.\n\t * @returns An array of data keys.\n\t */\n\t$dataKeys() {\n\t\treturn this.#dataKeys.toArray();\n\t}\n\n\t/**\n\t * Creates a data object from the instance.\n\t * @returns The data object.\n\t */\n\t$data(): data {\n\t\tconst target = {} as data;\n\n\t\tthis.#dataKeys.forEach((key) => {\n\t\t\ttarget[key] = Reflect.get(this, key) as any;\n\t\t});\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Selects specific keys from the object.\n\t * @param keys - The keys to select.\n\t * @returns An object with the selected keys.\n\t */\n\t$selectKeys<keys extends keyof this>(keys: keys[]) {\n\t\treturn Lib.selectKeys(this, keys);\n\t}\n\n\t/**\n\t * Creates a clone of the current object.\n\t * @returns A cloned instance of the object.\n\t */\n\t$clone(): this {\n\t\tconst copy = construct({\n\t\t\ttarget: {},\n\t\t\tdata: this,\n\t\t\thidden: this.#hidden,\n\t\t});\n\n\t\tObject.setPrototypeOf(copy, Object.getPrototypeOf(this));\n\n\t\treturn copy;\n\t}\n\n\t/**\n\t * Updates the object with a patch.\n\t * @param patch - The patch to apply.\n\t * @returns A new instance with the applied patch.\n\t */\n\t$update(patch: Partial<typeof this.$$dataT>): this {\n\t\tconst copy = construct({\n\t\t\ttarget: {},\n\t\t\tdata: { ...this, ...patch },\n\t\t\thidden: this.#hidden,\n\t\t});\n\n\t\tObject.setPrototypeOf(copy, Object.getPrototypeOf(this));\n\n\t\treturn copy;\n\t}\n\n\t/**\n\t * Applies a patch function to the object.\n\t * @param fn - The function that returns a patch.\n\t * @returns A new instance with the applied patch.\n\t */\n\t$patch(fn: (data: this) => Partial<typeof this.$$dataT>): this {\n\t\tconst patch = fn(this.$clone());\n\t\treturn this.$update(patch);\n\t}\n\n\t/**\n\t * Creates a new instance of the object.\n\t * @param args - The arguments to pass to the constructor.\n\t * @returns A new instance of the object.\n\t */\n\t$create(...args: args): this {\n\t\t// @ts-expect-error\n\t\treturn new this.constructor(...args);\n\t}\n}\n\nexport { StruktBase as t };\n","import * as Im from 'immutable';\n\nimport * as Err from './Error.ts';\n// import * as Lib from './Lib.ts';\n// import * as Strukt from './Strukt.ts';\nimport type * as T from './Types/Types.d.ts';\n\nexport type callbackFn<data, result> = (\n\tvalue: data,\n\tctx: SwitchContext,\n) => result;\nexport type predicateFn<data> = (value: data, ctx: SwitchContext) => boolean;\n\nexport type errorCallback<t> = (params: {\n\ttarget: t;\n\tctx: SwitchContext;\n\tcause: Error;\n}) => Error;\n\n// TODO tests\n// TODO tsdocs\n// TODO instance structural exclude warning\n// TODO as const warning\n\nexport type typeofName = 'string' | 'number' | 'boolean' | 'symbol' | 'bigint';\n\nexport type dispatcher = {\n\ttest: predicateFn<any>;\n\tcallback: callbackFn<any, any>;\n};\n\nexport type params<target, result> = {\n\ttarget?: target;\n\tctxData?: any;\n\tdispatchers?: Im.List<dispatcher>;\n\tmapper?: callbackFn<result, any>;\n};\n\nexport const continueSymbol: unique symbol = Symbol('switch/continue');\n\n// TODO figure out typing\nexport class SwitchContext {\n\tdata: any;\n\ttarget: any;\n\n\tconstructor(params: { data: any; target: any }) {\n\t\tthis.target = params.target;\n\t\tthis.data = params.data ?? {};\n\t}\n\n\t// \tsetData(data: any) {\n\t// \t\tthis.data = data;\n\t// \t\treturn this;\n\t// \t}\n\t//\n\t// \tsetTarget(target: any) {\n\t// \t\tthis.target = target;\n\t// \t\treturn this;\n\t// \t}\n\n\tcontinue<t>(): t {\n\t\treturn continueSymbol as unknown as t;\n\t}\n}\n\nexport { Switch, Switch as t };\n/**\n * A class that allows for conditional execution of callbacks based on various criteria.\n * @template data - The type of data being tested.\n * @template result - The type of result returned by the callbacks.\n * @template notChecked - The type of data that has not been checked.\n */\nclass Switch<target, result = never, notChecked = target> {\n\ttarget?: target;\n\t#dispatchers: Im.List<dispatcher>;\n\t#mapper?: callbackFn<result, any>;\n\n\tconstructor(params?: params<target, result>) {\n\t\tthis.target = params?.target;\n\t\tthis.#dispatchers = Im.List(params?.dispatchers);\n\t\tthis.#mapper = params?.mapper;\n\t}\n\n\tclone() {\n\t\treturn this.#update();\n\t}\n\n\t#update(params?: Partial<params<target, result>>) {\n\t\treturn new Switch({\n\t\t\ttarget: params?.target ?? this.target,\n\t\t\tdispatchers: params?.dispatchers ?? this.#dispatchers,\n\t\t\tmapper: params?.mapper ?? this.#mapper,\n\t\t});\n\t}\n\n\t#reset() {\n\t\treturn this.#update({ target: undefined });\n\t}\n\n\tsave() {\n\t\tconst saved = this.#reset();\n\t\treturn (data: target, ctxData?: any): result => saved.run(data, ctxData);\n\t}\n\n\trun(target?: target, ctxData?: any): result {\n\t\tif (target == null) {\n\t\t\treturn this.run(this.target, ctxData);\n\t\t}\n\n\t\tconst ctx = new SwitchContext({\n\t\t\tdata: ctxData,\n\t\t\ttarget,\n\t\t});\n\n\t\tfor (const dispatcher of this.#dispatchers) {\n\t\t\tif (!dispatcher.test(target, ctx)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst result = dispatcher.callback(target, ctx);\n\n\t\t\tif (result === continueSymbol) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this.#mapper != null) {\n\t\t\t\treturn this.#mapper(result, ctx);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tthrow new SwitchNoMatch(target);\n\t}\n\n\tverify(\n\t\t..._notChecked: T.isNever<notChecked> extends true\n\t\t\t? []\n\t\t\t: [never, 'Not all cases are checked:', notChecked]\n\t): this {\n\t\treturn this;\n\t}\n\n\tsaveStrict(\n\t\t..._notChecked: T.isNever<notChecked> extends true\n\t\t\t? []\n\t\t\t: [never, 'Not all cases are checked:', notChecked]\n\t) {\n\t\treturn this.save();\n\t}\n\n\trunStrict(\n\t\t..._notChecked: T.isNever<notChecked> extends true\n\t\t\t? []\n\t\t\t: [never, 'Not all cases are checked:', notChecked]\n\t) {\n\t\treturn this.run();\n\t}\n\n\t#dispatch<t extends Switch<any, any, any>>(dispatcher: dispatcher): t {\n\t\treturn this.#update({\n\t\t\tdispatchers: this.#dispatchers.push(dispatcher),\n\t\t}) as t;\n\t}\n\n\twhen<checked = never, res = result>(\n\t\ttest: boolean | predicateFn<target>,\n\t\tcallback: callbackFn<\n\t\t\tT.isNever<checked> extends true ? target : checked,\n\t\t\tres\n\t\t>,\n\t): Switch<target, result | res, Exclude<notChecked, checked>> {\n\t\tif (typeof test === 'boolean') {\n\t\t\treturn this.#dispatch({\n\t\t\t\ttest: () => test,\n\t\t\t\tcallback,\n\t\t\t});\n\t\t}\n\n\t\treturn this.#dispatch({\n\t\t\ttest,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\totherwise<res>(\n\t\tcallback: callbackFn<notChecked, res>,\n\t): Switch<target, result | res, never> {\n\t\treturn this.#dispatch({\n\t\t\ttest: () => true,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\totherwiseThrow(error?: Error | errorCallback<notChecked>) {\n\t\tif (error == null) {\n\t\t\treturn this.otherwise(() => {\n\t\t\t\tthrow new SwitchNoMatch(this.target);\n\t\t\t});\n\t\t}\n\n\t\tif (error instanceof Error) {\n\t\t\treturn this.otherwise(() => {\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t}\n\n\t\treturn this.otherwise((target, ctx) => {\n\t\t\tconst cause = new SwitchNoMatch(this.target);\n\t\t\tthrow error({ target, ctx, cause });\n\t\t});\n\t}\n\n\twhenValue<val extends notChecked[], res>(\n\t\tvalue: val,\n\t\tcallback: callbackFn<val[number], res>,\n\t): Switch<target, result | res, Exclude<notChecked, val[number]>>;\n\twhenValue<val extends notChecked, res>(\n\t\tvalue: val,\n\t\tcallback: callbackFn<val, res>,\n\t): Switch<target, result | res, Exclude<notChecked, val>>;\n\twhenValue(value: unknown, callback: callbackFn<unknown, unknown>) {\n\t\tif (!Array.isArray(value)) {\n\t\t\treturn this.#dispatch({\n\t\t\t\ttest: (x) => x === value,\n\t\t\t\tcallback,\n\t\t\t});\n\t\t}\n\n\t\tconst set = Im.Set(value);\n\t\treturn this.#dispatch({\n\t\t\ttest: (x) => set.has(x),\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenInstance<k extends T.anyClass, res>(\n\t\tklass: k,\n\t\tcallback: callbackFn<InstanceType<k>, res>,\n\t): Switch<target, result | res, Exclude<notChecked, InstanceType<k>>>;\n\twhenInstance<k extends T.anyClass[], res>(\n\t\tklasses: k,\n\t\tcallback: callbackFn<InstanceType<k[number]>, res>,\n\t): Switch<target, result | res, Exclude<notChecked, InstanceType<k[number]>>>;\n\twhenInstance(\n\t\tklass: T.anyClass | T.anyClass[],\n\t\tcallback: callbackFn<unknown, unknown>,\n\t) {\n\t\tif (!Array.isArray(klass)) {\n\t\t\treturn this.#dispatch({\n\t\t\t\ttest: (x) => x instanceof klass,\n\t\t\t\tcallback,\n\t\t\t});\n\t\t}\n\n\t\treturn this.#dispatch({\n\t\t\ttest: (x) => klass.some((k) => x instanceof k),\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenString<res>(callback: callbackFn<string, res>) {\n\t\treturn this.whenTypeOf('string', callback);\n\t}\n\n\twhenNumber<res>(callback: callbackFn<number, res>) {\n\t\treturn this.whenTypeOf('number', callback);\n\t}\n\n\twhenBoolean<res>(callback: callbackFn<boolean, res>) {\n\t\treturn this.whenTypeOf('boolean', callback);\n\t}\n\n\twhenSymbol<res>(callback: callbackFn<symbol, res>) {\n\t\treturn this.whenTypeOf('symbol', callback);\n\t}\n\n\twhenBigint<res>(callback: callbackFn<bigint, res>) {\n\t\treturn this.whenTypeOf('bigint', callback);\n\t}\n\n\twhenTypeOf<res>(\n\t\ttype: 'string',\n\t\tcallback: callbackFn<string, res>,\n\t): Switch<target, result | res, Exclude<notChecked, string>>;\n\twhenTypeOf<res>(\n\t\ttype: 'number',\n\t\tcallback: callbackFn<number, res>,\n\t): Switch<target, result | res, Exclude<notChecked, number>>;\n\twhenTypeOf<res>(\n\t\ttype: 'boolean',\n\t\tcallback: callbackFn<boolean, res>,\n\t): Switch<target, result | res, Exclude<notChecked, boolean>>;\n\twhenTypeOf<res>(\n\t\ttype: 'symbol',\n\t\tcallback: callbackFn<symbol, res>,\n\t): Switch<target, result | res, Exclude<notChecked, symbol>>;\n\twhenTypeOf<res>(\n\t\ttype: 'bigint',\n\t\tcallback: callbackFn<bigint, res>,\n\t): Switch<target, result | res, Exclude<notChecked, bigint>>;\n\twhenTypeOf<res>(type: typeofName, callback: callbackFn<any, res>) {\n\t\treturn this.#dispatch({\n\t\t\t// biome-ignore lint/suspicious/useValidTypeof: <explanation>\n\t\t\ttest: (x) => typeof x === type,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenUndefined<res>(\n\t\tcallback: callbackFn<undefined, res>,\n\t): Switch<target, result | res, Exclude<notChecked, undefined>> {\n\t\treturn this.#dispatch({\n\t\t\ttest: (x) => x === undefined,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenNull<res>(\n\t\tcallback: callbackFn<null, res>,\n\t): Switch<target, result | res, Exclude<notChecked, null>> {\n\t\treturn this.#dispatch({\n\t\t\ttest: (x) => x === null,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenOptional<res>(callback: callbackFn<undefined | null, res>) {\n\t\treturn this.#dispatch({\n\t\t\ttest: (x) => x == null,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenTrue<res>(\n\t\tcallback: callbackFn<true, res>,\n\t): Switch<target, result | res, Exclude<notChecked, true>> {\n\t\treturn this.#dispatch({\n\t\t\ttest: () => true,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\twhenFalse<res>(\n\t\tcallback: callbackFn<false, res>,\n\t): Switch<target, result | res, Exclude<notChecked, false>> {\n\t\treturn this.#dispatch({\n\t\t\ttest: () => false,\n\t\t\tcallback,\n\t\t});\n\t}\n\n\tmap<res>(fn: callbackFn<result, res>): Switch<target, res, notChecked> {\n\t\tif (this.#mapper == null) {\n\t\t\treturn this.#update({\n\t\t\t\tmapper: fn,\n\t\t\t}) as unknown as Switch<target, res, notChecked>;\n\t\t}\n\n\t\tconst oldMapper = this.#mapper!;\n\t\treturn this.#update({\n\t\t\tmapper: (x, ctx) => fn(oldMapper(x, ctx), ctx),\n\t\t}) as unknown as Switch<target, res, notChecked>;\n\t}\n}\n\nexport const switchCase = <target>(target: target) => new Switch({ target });\n\nexport const compileSwitch = <target>(): Switch<target, never, target> =>\n\tnew Switch();\n\n// Errors\n\nexport class SwitchNoMatch extends Err.init({\n\tconstructor(value: any) {\n\t\treturn {\n\t\t\tdata: { value },\n\t\t\tmessage: `No match found and no default provided for ${value}`,\n\t\t};\n\t},\n}) {}\n","import type * as T from './Types/Types.d.ts';\n\n/**\n * Represents metadata for an error, including optional message and cause.\n */\nexport type errorMeta = Record<string, any> & { message?: string; cause?: any };\n\n/**\n * Base class for structured errors with metadata.\n */\nexport class ErrorStruktBase extends Error {\n\toverride message: string;\n\treadonly meta: errorMeta;\n\n\tconstructor(msg: string, metaInput?: errorMeta) {\n\t\tconst meta = { ...metaInput };\n\n\t\tconst message = meta.message ?? msg;\n\n\t\tsuper(message, meta.cause == null ? undefined : { cause: meta.cause });\n\t\tthis.message = message;\n\t\tthis.name = this.constructor.name;\n\n\t\t// biome-ignore lint/performance/noDelete: <explanation>\n\t\tdelete meta.cause;\n\t\t// biome-ignore lint/performance/noDelete: <explanation>\n\t\tdelete meta.message;\n\t\tthis.meta = meta;\n\t}\n}\n\nexport type staticErrorInstance = ErrorStruktBase;\n\nexport type staticErrorClass = {\n\tnew (meta?: errorMeta): staticErrorInstance;\n\tnew (message: string, meta?: errorMeta): staticErrorInstance;\n};\n\n/**\n * Parameters for creating a static error.\n */\nexport type staticParams = {\n\tmessage?: string;\n};\n\n/**\n * Creates a static error class with optional parameters.\n * @param params - Optional parameters for the static error.\n * @returns A class for creating static error instances.\n * @example\n * // Create a static error class with a default message\n * class MyError extends staticError({ message: 'Default error message' }) {}\n *\n * // Create an instance of the error with a specific message\n * const errorInstance = new MyError('Specific error message');\n * console.log(errorInstance.message); // Output: 'Specific error message'\n *\n * // Create an instance with metadata\n * const meta = { annotation: 'test' };\n * const errorWithMeta = new MyError(meta);\n * console.log(errorWithMeta.meta); // Output: { annotation: 'test' }\n */\nexport const staticError = (params?: staticParams): staticErrorClass => {\n\tconst msg = params?.message ?? '';\n\n\tclass StaticStruktError extends ErrorStruktBase {\n\t\tconstructor(param1?: string | errorMeta, param2?: errorMeta) {\n\t\t\tconst meta = typeof param1 === 'string' ? param2 : param1;\n\t\t\tconst message = typeof param1 === 'string' ? param1 : msg;\n\t\t\tsuper(message, meta);\n\t\t}\n\t}\n\n\treturn StaticStruktError as staticErrorClass;\n};\n\n/**\n * Represents an instance of an error with data.\n */\nexport type errorInstance<t> = staticErrorInstance & {\n\tdata: t;\n};\n\nexport type errorClass<constructor extends anyErrConstructor> =\n\tT.fnParam1<constructor> extends Exclude<T.fnParam1<constructor>, undefined>\n\t\t? {\n\t\t\t\tnew (\n\t\t\t\t\targs: T.fnParam1<constructor>,\n\t\t\t\t\tmeta?: errorMeta,\n\t\t\t\t): errorInstance<constructorData<constructor>>;\n\t\t\t}\n\t\t: {\n\t\t\t\tnew (\n\t\t\t\t\targs?: T.fnParam1<constructor>,\n\t\t\t\t\tmeta?: errorMeta,\n\t\t\t\t): errorInstance<constructorData<constructor>>;\n\t\t\t};\n\n/**\n * Extracts the data type from a constructor function.\n */\nexport type constructorData<fn extends anyErrConstructor> =\n\tReturnType<fn>['data'];\n\n/**\n * Represents a constructor function for errors.\n */\nexport type errConstructor<input, data> = (input: input) => {\n\tdata?: data;\n\tmessage?: string;\n};\nexport type anyErrConstructor = errConstructor<any, any>;\n\n/**\n * Parameters for initializing an error class.\n */\nexport type params<constructor extends anyErrConstructor> = {\n\tconstructor: constructor;\n};\n\n/**\n * Initializes an error class with a given constructor.\n * @param params - Parameters including the constructor function.\n * @returns A class for creating error instances.\n * @example\n * // Define a constructor function for the error\n * class MyError extends init({\n * constructor(input: { value: number }) {\n * return {\n * data: { value: input.value, isEven: input.value % 2 === 0 },\n * message: `Error with value ${input.value}`,\n * };\n * }\n * }) {}\n *\n * // Create an instance of the error\n * const errorInstance = new MyError({ value: 42 });\n * console.log(errorInstance.message); // Output: 'Error with value 42'\n * console.log(errorInstance.data); // Output: { value: 42, isEven: true }\n */\nexport const init = <constructor extends anyErrConstructor>(\n\tparams: params<constructor>,\n): errorClass<constructor> => {\n\ttype input = Parameters<constructor>[0];\n\ttype data = ReturnType<constructor>;\n\n\tconst constructorFn: constructor = params.constructor;\n\n\tclass StruktError extends ErrorStruktBase {\n\t\treadonly data: data;\n\n\t\tconstructor(input: input, meta?: errorMeta) {\n\t\t\tconst { data, message } = constructorFn(input);\n\n\t\t\tsuper(message ?? '', meta);\n\t\t\tthis.data = data;\n\t\t}\n\t}\n\n\treturn StruktError;\n};\n\nexport const isErrorStrukt = (value: unknown): value is ErrorStruktBase =>\n\tvalue instanceof ErrorStruktBase;\n","// Stryker disable all\n\nexport { SwitchNoMatch } from './Switch.ts';\nexport { DispatchMapKeyNotFound } from './DispatchMap.ts';\nexport { EnumAssertionError } from './Enum.ts';\n","import * as Err from './Error.ts';\nimport * as Lib from './Lib.ts';\n\nexport type mapShape = {\n\t[key: PropertyKey]: any;\n};\n\nexport type findFn<t> = (value: t) => boolean;\n\nexport { DispatchMap, DispatchMap as t };\n\n// TODO tsdoc\n// TODO tests\n\nclass DispatchMap<shape extends mapShape> {\n\treadonly #shape: shape;\n\tconstructor(shape: shape) {\n\t\tthis.#shape = { ...shape };\n\t}\n\n\tget shape() {\n\t\treturn this.#shape;\n\t}\n\n\tget $$key(): keyof shape {\n\t\treturn undefined as any;\n\t}\n\n\tget $$value(): shape[keyof shape] {\n\t\treturn undefined as any;\n\t}\n\n\tget $$entry(): { key: keyof shape; value: shape[keyof shape] } {\n\t\treturn undefined as any;\n\t}\n\n\thas(key: unknown): key is keyof shape {\n\t\treturn (key as PropertyKey) in this.#shape;\n\t}\n\n\tkeys(): (keyof shape)[] {\n\t\treturn Object.keys(this.#shape);\n\t}\n\n\tvalues(): shape[keyof shape][] {\n\t\treturn Object.values(this.#shape);\n\t}\n\n\tentries() {\n\t\treturn Object.entries(this.#shape).map(([key, value]) => ({\n\t\t\tkey: key as keyof shape,\n\t\t\tvalue: value as shape[keyof shape],\n\t\t}));\n\t}\n\n\tget<key extends keyof shape>(key: key): shape[key] {\n\t\tif (!this.has(key)) {\n\t\t\tthrow new DispatchMapKeyNotFound({ key, map: this });\n\t\t}\n\n\t\treturn this.#shape[key];\n\t}\n\n\tgetSafe<key extends keyof shape, notSetValue = undefined>(\n\t\tkey: key,\n\t\tnotSetValue?: notSetValue,\n\t): shape[key] | notSetValue {\n\t\tif (this.has(key)) {\n\t\t\treturn this.get(key);\n\t\t}\n\n\t\treturn notSetValue as notSetValue;\n\t}\n\n\tindex(key: PropertyKey): shape[keyof shape] {\n\t\treturn this.get(key);\n\t}\n\n\tindexSafe<notSetValue = undefined>(\n\t\tkey: PropertyKey,\n\t\tnotSetValue?: notSetValue,\n\t): shape[keyof shape] | notSetValue {\n\t\treturn this.getSafe(key, notSetValue);\n\t}\n\n\t@Lib.lazy()\n\tget reverse(): DispatchMap<{ [key in typeof this.$$value]: keyof shape }> {\n\t\tconst shape = {} as any;\n\n\t\tfor (const { key, value } of this.entries()) {\n\t\t\tif (value in shape) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tshape[value] = key;\n\t\t}\n\n\t\treturn new DispatchMap(shape);\n\t}\n\n\treverseFind(fn: findFn<typeof this.$$entry>) {\n\t\tconst item = this.entries().find((entry) => fn(entry));\n\t\treturn item?.key;\n\t}\n\n\treverseFindOne(fn: findFn<typeof this.$$entry>) {\n\t\tfor (const entry of this.entries()) {\n\t\t\tif (fn(entry)) {\n\t\t\t\treturn entry.key;\n\t\t\t}\n\t\t}\n\n\t\tthrow new DispatchMapSearchFailed({ map: this });\n\t}\n\n\treverseFindMany(fn: findFn<typeof this.$$entry>) {\n\t\treturn this.entries()\n\t\t\t.filter((entry) => fn(entry))\n\t\t\t.map(({ key }) => key);\n\t}\n}\n\nexport const init = <shape extends mapShape>(shape: shape) =>\n\tnew DispatchMap(shape);\n\nexport class DispatchMapKeyNotFound extends Err.init({\n\tconstructor(params: { key: unknown; map: DispatchMap<any> }) {\n\t\tconst { key, map } = params;\n\t\tconst keys = map.keys();\n\n\t\tconst data = {\n\t\t\tkey,\n\t\t\tmap,\n\t\t\tkeys,\n\t\t};\n\n\t\tconst keysString = keys.join(', ');\n\t\tconst message = `Key not found: ${key}. Available keys: ${keysString}`;\n\n\t\treturn {\n\t\t\tdata,\n\t\t\tmessage,\n\t\t};\n\t},\n}) {}\n\nexport class DispatchMapSearchFailed extends Err.init({\n\tconstructor(params: { map: DispatchMap<any> }) {\n\t\tconst { map } = params;\n\n\t\tconst data = {\n\t\t\tmap,\n\t\t};\n\n\t\tconst message = 'Search failed';\n\t\treturn {\n\t\t\tdata,\n\t\t\tmessage,\n\t\t};\n\t},\n}) {}\n","import * as Im from 'immutable';\n\n// import type * as T from '#Types';\nimport * as Err from './Error.ts';\nimport * as StruktBase from './StruktBase.ts';\nimport * as Switch from './Switch.ts';\n\nexport type enumValue = string | number;\nexport type enumValues = Iterable<enumValue>;\n\nexport type enumStrukt<values extends enumValue> = Enum<values> & {\n\t[key in values]: key;\n};\n\nexport { Enum, Enum as t };\nclass Enum<values extends enumValue> {\n\t#values: Im.Set<values>;\n\n\tconstructor(values: Iterable<values>) {\n\t\tthis.#values = Im.Set(values);\n\n\t\tconst data = {} as any;\n\t\tfor (const value of values) {\n\t\t\tdata[value] = value;\n\t\t}\n\n\t\tStruktBase.construct({\n\t\t\ttarget: this,\n\t\t\tdata,\n\t\t\thidden: [],\n\t\t});\n\t}\n\n\tget $$t(): values {\n\t\treturn undefined as any;\n\t}\n\n\tget $values() {\n\t\treturn this.#values;\n\t}\n\n\t[Symbol.iterator]() {\n\t\treturn this.#values[Symbol.iterator]();\n\t}\n\n\t$has(value: unknown): value is values {\n\t\treturn this.#values.has(value as values);\n\t}\n\n\t$is<target extends values>(target: target, value: unknown): value is target {\n\t\treturn target === value;\n\t}\n\n\t$assert<subValues extends values>(\n\t\tvalue: unknown,\n\t\tsubValues?: Iterable<subValues>,\n\t): values {\n\t\tconst testSet = subValues ? Im.Set(subValues) : this.#values;\n\n\t\tif (!testSet.has(value as subValues)) {\n\t\t\tthrow new EnumAssertionError({\n\t\t\t\ttarget: value,\n\t\t\t\texpected: testSet.toArray(),\n\t\t\t});\n\t\t}\n\n\t\treturn value as values;\n\t}\n\n\t$toArray() {\n\t\treturn this.#values.toArray();\n\t}\n\n\t$subEnum<subValues extends values>(subValues: Iterable<subValues>) {\n\t\treturn init(subValues);\n\t}\n\n\t$add<newValues extends enumValue>(...values: newValues[]) {\n\t\treturn init(this.#values.union(values));\n\t}\n\n\t$remove<removedValues extends values>(...values: removedValues[]) {\n\t\tconst newSet = this.#values.subtract(values) as Im.Set<\n\t\t\tExclude<values, removedValues>\n\t\t>;\n\t\treturn init(newSet);\n\t}\n\n\t$switchCase(value: values) {\n\t\treturn Switch.switchCase<values>(value as values);\n\t}\n\n\t$assertSwitchCase(value: unknown) {\n\t\treturn this.$switchCase(this.$assert(value));\n\t}\n\n\t$compileSwitch() {\n\t\treturn Switch.compileSwitch<values>();\n\t}\n}\n\nexport const init = <values extends enumValue>(\n\tvalues: Iterable<values>,\n): enumStrukt<values> => new Enum(values) as enumStrukt<values>;\n\nexport class EnumAssertionError extends Err.init({\n\tconstructor(params: { target: unknown; expected: enumValue[] }) {\n\t\tconst { target, expected } = params;\n\t\tconst data = { target, expected };\n\n\t\tconst message = `Invalid enum value: ${target}. Expected one of: ${expected.join(\n\t\t\t', ',\n\t\t)}`;\n\n\t\treturn {\n\t\t\tmessage,\n\t\t\tdata,\n\t\t};\n\t},\n}) {}\n","import * as Im from 'immutable';\n\n/**\n * Represents a list of keys used to access values in a FlatObject.\n */\nexport type keys = Im.List<string>;\n\n/**\n * Represents an iterable of strings, excluding a single string.\n * Used for specifying keys in a flexible manner.\n */\nexport type keysLike = Exclude<Iterable<string>, string>;\n\n/**\n * Represents the index map of a FlatObject, mapping keys to values.\n * @template t - The type of values stored in the index.\n */\nexport type index<t> = Im.Map<keys, t>;\n\nexport { fromObject as toFlatObject };\n\n/**\n * Converts a nested object into a FlatObject.\n * @example\n * const flat = fromObject({ a: { b: 1 } });\n * console.log(flat.get(['a', 'b'])); // Outputs: 1\n * @param obj - The object to convert.\n * @returns A FlatObject representation of the input object.\n */\nexport const fromObject = <t>(obj: Record<string, any>): FlatObject<t> => {\n\tlet index: index<t> = Im.Map();\n\tlet objectKeys = Im.Stack(\n\t\tObject.keys(obj).map((key) =>\n\t\t\t// Stryker disable next-line ArrayDeclaration\n\t\t\tmakeKeys([key]),\n\t\t),\n\t);\n\n\twhile (!objectKeys.isEmpty()) {\n\t\tconst keys = objectKeys.peek()!;\n\t\tobjectKeys = objectKeys.pop();\n\n\t\tconst value = keys.reduce((target: any, key) => target[key], obj);\n\n\t\tif (!isTrueObject(value)) {\n\t\t\tindex = index.set(keys, value);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst newKeys = Object.keys(value).map((key) => keys.push(key));\n\n\t\tif (newKeys.length === 0) {\n\t\t\tindex = index.set(keys, value as t);\n\t\t\tcontinue;\n\t\t}\n\n\t\tobjectKeys = objectKeys.pushAll(newKeys);\n\t}\n\n\treturn flatObject(index);\n};\n\n/**\n * Creates a deep copy of an object using FlatObject.\n * @example\n * const original = { a: { b: 1 } };\n * const copyObj = copy(original);\n * console.log(copyObj); // Outputs: { a: { b: 1 } }\n * @param obj - The object to copy.\n * @returns A deep copy of the input object.\n */\nexport const copy = <t extends Record<string, any>>(obj: t): t =>\n\tfromObject(obj).toJS<t>();\n\n/**\n * Creates a new FlatObject instance from an index map.\n * @param index - The index map for the FlatObject.\n * @returns A new FlatObject instance.\n */\nexport const flatObject = <t>(index?: index<t>): FlatObject<t> =>\n\tnew FlatObject(index ?? Im.Map());\n\nexport const makeKeys = (keys: keysLike): keys => Im.List(keys);\n\nexport const isTrueObject = (x: unknown): x is object =>\n\tx != null && (x as any).__proto__ === Object.prototype;\n\nexport { FlatObject as t };\n\n/**\n * Represents a flat structure of a nested object.\n */\nexport class FlatObject<t = any> {\n\t#index: index<t>;\n\n\tconstructor(index: index<t>) {\n\t\tthis.#index = index;\n\t}\n\n\tget index() {\n\t\treturn this.#index;\n\t}\n\n\t/**\n\t * Retrieves a value from the FlatObject.\n\t * @example\n\t * const value = flatObject.get<number>(['a', 'b']);\n\t * console.log(value); // Outputs: 1\n\t * @param keys - The keys to retrieve the value for.\n\t * @returns The value associated with the keys.\n\t */\n\tget<k>(keys: keysLike): k {\n\t\treturn this.#index.get(makeKeys(keys)) as k;\n\t}\n\n\t/**\n\t * Sets a value in the FlatObject and returns a new instance.\n\t * @example\n\t * const newFlat = flatObject.set(['a', 'b'], 2);\n\t * console.log(newFlat.get(['a', 'b'])); // Outputs: 2\n\t * @param keys - The keys to set the value for.\n\t * @param value - The value to set.\n\t * @returns A new FlatObject with the updated value.\n\t */\n\tset(keys: keysLike, value: t) {\n\t\tconst index = this.#index.set(makeKeys(keys), value);\n\t\treturn flatObject(index);\n\t}\n\n\t/**\n\t * Sets a value in the FlatObject in place.\n\t * @example\n\t * flatObject.setMut(['a', 'b'], 2);\n\t * console.log(flatObject.get(['a', 'b'])); // Outputs: 2\n\t * @param keys - The keys to set the value for.\n\t * @param value - The value to set.\n\t * @returns The current FlatObject instance.\n\t */\n\tsetMut(keys: keysLike, value: t) {\n\t\tthis.#index = this.#index.set(makeKeys(keys), value);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Checks if the FlatObject contains the specified keys.\n\t * @example\n\t * const exists = flatObject.has(['a', 'b']);\n\t * console.log(exists); // Outputs: true or false\n\t * @param keys - The keys to check for.\n\t * @returns `true` if the keys exist, `false` otherwise.\n\t */\n\thas(keys: keysLike): boolean {\n\t\treturn this.#index.has(makeKeys(keys));\n\t}\n\n\t/**\n\t * Converts the FlatObject back to a regular JavaScript object.\n\t * @example\n\t * const obj = flatObject.toJS();\n\t * console.log(obj); // Outputs: { a: { b: 1 } }\n\t * @returns A JavaScript object representation of the FlatObject.\n\t * @template r - The type of the resulting JavaScript object.\n\t */\n\ttoJS<r>(): r {\n\t\tconst result = {};\n\t\tthis.entries().forEach((property) => {\n\t\t\tlet target: any = result;\n\n\t\t\tproperty.keys.butLast().forEach((key) => {\n\t\t\t\tif (!(key in target)) {\n\t\t\t\t\ttarget[key] = {};\n\t\t\t\t}\n\n\t\t\t\ttarget = target[key];\n\t\t\t});\n\n\t\t\tconst lastKey = property.keys.last();\n\t\t\tif (lastKey != null) {\n\t\t\t\ttarget[lastKey] = property.value;\n\t\t\t}\n\t\t});\n\n\t\treturn result as r;\n\t}\n\n\t/**\n\t * Transforms the FlatObject using a provided function.\n\t * @example\n\t * const transformed = flatObject.transform(index => index.map(value => value * 2));\n\t * @param fn - The function to transform the index.\n\t * @returns A new FlatObject with the transformed index.\n\t */\n\ttransform<r>(fn: (index: index<t>) => index<r>): FlatObject<r> {\n\t\tconst newIndex = fn(this.#index);\n\t\treturn flatObject(newIndex);\n\t}\n\n\t/**\n\t * Maps each value in the FlatObject to a new value.\n\t * @example\n\t * const mapped = flatObject.map<number>((value, keys) => value * 2);\n\t * @param fn - The function to map each value.\n\t * @returns A new FlatObject with mapped values.\n\t */\n\tmap<r>(fn: (value: t, keys: keys) => r): FlatObject<r> {\n\t\treturn this.transform((index) => index.map(fn));\n\t}\n\n\t/**\n\t * Filters the FlatObject based on a predicate function.\n\t * @example\n\t * const filtered = flatObject.filter((value, keys) => value > 1);\n\t * console.log(filtered.toJS()); // Outputs only properties with values greater than 1\n\t * @param fn - The predicate function to filter values. It receives the value and keys as arguments.\n\t * @returns A new FlatObject with filtered values.\n\t */\n\tfilter(fn: (value: t, keys: keys) => boolean): FlatObject<t> {\n\t\treturn this.transform((index) => index.filter(fn));\n\t}\n\n\t/**\n\t * Merges another FlatObject into this one.\n\t * @example\n\t * const merged = flatObject.merge(otherFlatObject);\n\t * @param other - The other FlatObject to merge.\n\t * @returns A new FlatObject with merged values.\n\t */\n\tmerge<r>(other: FlatObject<r>): FlatObject<t | r> {\n\t\treturn this.transform((index) => index.merge(other.index));\n\t}\n\n\tkeys(): Im.List<keys> {\n\t\treturn this.#index.keySeq().toList();\n\t}\n\n\tvalues(): Im.List<t> {\n\t\treturn this.#index.valueSeq().toList();\n\t}\n\n\tentries(): Im.List<{ keys: keys; value: t }> {\n\t\treturn this.#index\n\t\t\t.entrySeq()\n\t\t\t.map(([keys, value]) => ({\n\t\t\t\tvalue,\n\t\t\t\tkeys,\n\t\t\t}))\n\t\t\t.toList();\n\t}\n\n\tget size(): number {\n\t\treturn this.#index.size;\n\t}\n\n\tisEmpty(): boolean {\n\t\treturn this.#index.isEmpty();\n\t}\n\n\tisNotEmpty(): boolean {\n\t\treturn !this.isEmpty();\n\t}\n}\n"],"mappings":"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