import type { Flat } from "atom.io/foundations/type-utils" type Count = [ ...A, any, ][`length`] extends N ? A[`length`] : A[`length`] | Count /** Tuples of `[key, value]` pairs, as returned from `Object.entries` */ export type Entries = [K, V][] /** The collective or "union" type of the keys in a set of entries */ export type KeyOfEntries = E extends [infer K, any][] ? K : never /** The type of the value of entry `K` in a set of entries `E` */ export type ValueOfEntry> = { [P in Count]: E[P] extends [K, infer V] ? V : never }[Count] /** The type of a set of entries `E` in object form */ export type FromEntries = Flat<{ [K in KeyOfEntries]: ValueOfEntry }> /** Typed form of `Object.fromEntries` */ export function fromEntries(entries: E): FromEntries { return Object.fromEntries(entries) as FromEntries } /** The type of an object T in {@link Entries} form */ export type ToEntries = Entries /** Typed form of `Object.entries` */ export function toEntries(obj: T): ToEntries { return Object.entries(obj) as Entries }