import type { Args, Fn } from "../HKT"; import type { List } from "../List"; import type { ToSnakeCase } from "../Str/ToSnakeCase"; type _SnakeizeMutableList = TS extends [infer Head, ...infer Tail] ? [Head extends object ? Snakeize : Head, ..._SnakeizeMutableList] : []; type _SnakeizeImmutableList = TS extends readonly [infer Head, ...infer Tail] ? readonly [Head extends object ? Snakeize : Head, ..._SnakeizeImmutableList] : readonly []; export type Snakeize = O extends Array ? number extends O["length"] ? Array : U> : _SnakeizeMutableList : O extends ReadonlyArray ? number extends O["length"] ? ReadonlyArray : U> : _SnakeizeImmutableList : { [K in keyof O & string as ToSnakeCase]: [O[K]] extends [object] ? Snakeize : O[K] }; export default interface SnakeizeFn extends Fn<[object], object> { def: ([o]: Args) => Snakeize; }