// deno-lint-ignore-file ban-types /* util types */ type Prettify = { [K in keyof T]: T[K]; } & {}; type FlattenMap = T extends [ infer Head, ...infer Tail ] ? FlattenMap : Result; /* numEnum */ type MapNumEnum = T extends [ infer Head extends string, ...infer Tail extends string[] ] ? MapNumEnum : Result; type NumEnum = Prettify>>; /** * create an enum with numeric keys that match the input * @param values list of keys * @returns an "enum" */ export const numEnum = (values: T): NumEnum => { const result: Record = {}; for (let i = 0; i < values.length; i++) { result[values[i]] = i; } return result as NumEnum; }; /* stringEnum */ type StringEnum = Prettify<{ [K in T[number]]: K; }>; /** * create an enum with string keys that match the input * @param values list of keys that will also be the values * @returns an "enum" */ export const stringEnum = ( values: T ): StringEnum => { const result: Record = {}; for (let i = 0; i < values.length; i++) { result[values[i]] = values[i]; } return result as StringEnum; };