import { fromEntries } from '../fromEntries' type Entry = [keyof Obj, Obj[keyof Obj]] const entries = (target: Target) => Object.entries(target) as Entry[] type Callback = ( pairs: Entry, ) => [TargetKey, TargetValue] const uncurriedMapObject = ( callback: Callback, object: Source, ) => (fromEntries(entries(object).map(callback)) as unknown) as Record< TargetKey, TargetValue > export function mapObject( callback: Callback, ): (source: Source) => { [k in TargetKey]: TargetValue } export function mapObject( callback: Callback, object: Source, ): { [k in TargetKey]: TargetValue } export function mapObject( callback: Callback, object?: Source, ): | { [k in TargetKey]: TargetValue } | ((source: Source) => { [k in TargetKey]: TargetValue }) { if (object === undefined) { return (object) => uncurriedMapObject(callback, object) } else { return uncurriedMapObject(callback, object) } }