import type { array } from "./arrays.ts"; import type { describeDomainOf, domainOf, inferDomain } from "./domain.ts"; import type { anyOrNever, satisfy, Stringifiable } from "./generics.ts"; import type { describeObject } from "./objectKinds.ts"; import type { stringifyUnion } from "./unionToTuple.ts"; export type DescribeOptions = { includeArticles?: boolean; branchDelimiter?: string; }; export type typeToString = stringifyUnion<[ t ] extends [anyOrNever] ? unknown extends t ? "any" : "never" : unknown extends t ? "unknown" : boolean extends t ? "boolean" | ([t] extends [boolean] ? never : typeToString, opts>) : t extends array ? arrayTypeToString : t extends object ? describeObject : t extends Stringifiable ? stringifiableToString : describeDomainOf, opts["branchDelimiter"] extends string ? opts["branchDelimiter"] : describeDefaults["branchDelimiter"]>; type stringifiableToString = inferDomain> extends t ? describeDomainOf : `${t}`; export type describe = typeToString; type arrayTypeToString = typeToString extends infer element extends string ? opts["includeArticles"] extends true ? describeArrayOf : includesDelimiter extends true ? `(${element})[]` : `${element}[]` : never; type describeArrayOf = element extends "unknown" ? "an array" : `an array of ${element}`; type includesDelimiter = s extends (`${string}${opts["branchDelimiter"] extends string ? opts["branchDelimiter"] : describeDefaults["branchDelimiter"]}${string}`) ? true : false; export type describeDefaults = satisfy, { includeArticles: false; branchDelimiter: " | "; }>; export {};