import type { evaluate } from "./generics.js" export const hasDomain = ( data: data, kind: domain ): data is data & inferDomain => domainOf(data as any) === kind type TypesByDomain = { bigint: bigint boolean: boolean number: number object: object string: string symbol: symbol undefined: undefined null: null } export type inferDomain = Domain extends kind ? unknown : TypesByDomain[kind] export type Domain = evaluate export type NullishDomain = "undefined" | "null" export type NonNullishDomain = Exclude export type PrimitiveDomain = Exclude export type Primitive = inferDomain export type domainOf = unknown extends data ? Domain : data extends object ? "object" : data extends string ? "string" : data extends number ? "number" : data extends boolean ? "boolean" : data extends undefined ? "undefined" : data extends null ? "null" : data extends bigint ? "bigint" : data extends symbol ? "symbol" : never export const domainOf = (data: data) => { const builtinType = typeof data return ( builtinType === "object" ? data === null ? "null" : "object" : builtinType === "function" ? "object" : builtinType ) as domainOf } /** Each domain's completion for the phrase "Must be _____" */ export const domainDescriptions = { bigint: "a bigint", boolean: "boolean", null: "null", number: "a number", object: "an object", string: "a string", symbol: "a symbol", undefined: "undefined" } as const satisfies Record