* Creates a new object with the same keys as the given object,
 * and values generated by running each own enumerable string keyed property of the object thru the function.
 * @param {Object.<string, ObjectValue>} object - The object to iterate over.
 * @param {(value: ObjectValue) => Returned} fn - The function invoked per iteration.
 * @returns {Object.<string, Returned>} The new object with the same keys and mapped values.
 * @template ObjectValue The type of the values in the input object.
 * @template Returned The type of the values in the returned object.
 * const object = { a: 1, b: 2 };
 * const fn = (value) => value * 2;
 * const result = mapObject(object, fn); // { a: 2, b: 4 }
export const mapObject = <
  Result extends Record<string, Returned>,
  object: { [key: string]: ObjectValue },
  fn: (value: ObjectValue) => Returned,
    Object.entries(object).map(([key, value]) => [key, fn(value)]),