import { Type } from 'free-types-core'; import { PathItem, Query, ILens, QueryItem } from './types.js'; import { Next } from './utils.js'; export { Lens, $Lens }; /** @internal */ type Lens = Q extends ILens ? Q : Q extends PathItem ? { __type_lenses: 'lens'; path: [Q]; } : Q extends readonly QueryItem[] ? { __type_lenses: 'lens'; path: Flatten; } : never; interface $Lens extends Type<[Query], ILens> { type: this[0] extends Query ? Lens : ILens; } type Flatten = I extends T['length'] ? R : T[I] extends PathItem ? Flatten, [...R, T[I]]> : T[I] extends ILens ? Flatten, [...R, ...T[I]['path']]> : never;