import { AnyMap, MapOf } from "../types"; declare type DeepMergable = ((item: T) => DeepMergable) | { [K in keyof T]?: DeepMergable | ((item: T[K]) => DeepMergable); }; /** * Creates a new `map` populated with every key in the original `map` where the * value behind each `k` in `keys` is the value `map[k]` shallowly merged with * the return value of `fn(map[k])`. * * ```tsx * newMap[k] = { ...map[k], ...fn(map[k]) }; * ``` * * Example usage: * * ```tsx * const out = modifyInMap( * { alice: { age: 34, gender: "f" }, bob: { age: 42, gender: "m" } }, * "alice", * person => ({ age: person.age + 1 }), * ); * console.log(out.alice); // { age: 35, gender: "f" } * console.log(out.bob); // { age: 42, gender: "m" } * ``` * * The original `map` is not modified. * * An error is thrown if any key in `keys` does not exist in the map. * * @param map - The map to copy and modify. * @param keys - The keys to merge within the map. * @returns A new map with modified values. */ export default function mergeInMap, K extends keyof M = keyof M>(map: M, keys: K | K[], /** * Expects a partial value of `map[key]`. * * Supports returning functions to compute properties like so: * * ```tsx * const map = { key: { count: 1 } }; * * // "Normal" syntax * mergeInMap(map, "key", (item) => ({ * count: item.count + 1, * })); * * // Compute function * mergeInMap(map, "key", () => ({ * count: (count) => count + 1, * })); * ``` */ toMerge: DeepMergable): M; export {};