import { isFunction, Primitive, ToString } from "../utils" export interface ObjectSerializer { serializeKey(key: U): T serializeValue(value: U): T end(): T } export interface IterableSerializer { serializeElement(element: U): T end(): T } const TypeSerializerMethods = [ 'serializeString', 'serializeNumber', 'serializeBigInt', 'serializeBoolean', 'serializeSymbol', //'serializeMap', 'serializeIterable', 'serializeNull', 'serializeObject', //'serializeClass', ] as const interface TypeSerializer { serializeString(value: string): T serializeNumber(value: number): T serializeBigInt(value: bigint): T serializeBoolean(value: boolean): T serializeSymbol(value: Symbol): T serializeNull(): T serializeObject(): ObjectSerializer // serializeMap?(): ObjectSerializer serializeIterable?(): IterableSerializer //serializeClass(name: PropertyKey): ObjectSerializer } const AnySerializerMethods = ['serializeAny'] interface AnySerializer { serializeAny?(value?: any): T } export function isGenericSerializer(value: any): boolean { return AnySerializerMethods.every(k => isFunction(value[k])) && TypeSerializerMethods.every(k => !isFunction(value[k])) } export type Serializer = Partial> & Partial> export type Serializable = Primitive | ToString | Serialize export interface Serialize { serialize>(serializer: S): T }