import type { Flat } from "atom.io/foundations/type-utils" export type IndexOf< T extends readonly unknown[], E, A extends unknown[] = [], > = T extends readonly [infer Head, ...infer Tail] ? (() => U extends Head ? 1 : 2) extends () => U extends E ? 1 : 2 ? A[`length`] : IndexOf : never export type Flip> = { [K in keyof T as T[K]]: K } export type TwoWay> = Flip & T export type Enumeration = Flat< TwoWay<{ [K in T[number]]: IndexOf }> > export function enumeration( values: T, ): Enumeration { const result: Record = {} let i = 0 for (const value of values) { result[value] = i result[i] = value ++i } return result as Enumeration }