import { Nullable } from '../utils' import { GenericSeed } from './generic' export interface MapAccess { nextKeySeed>(seed: K): Nullable nextValueSeed>(seed: V): Nullable nextEntrySeed, V extends Deserialize>(kseed: K, vseed: V): Nullable<[TK, TV]> nextKey(): Nullable nextValue(): Nullable nextEntry(): Nullable<[K, V]> } export abstract class DefaultMapAccessImpl implements MapAccess { abstract nextKeySeed>(seed: K): Nullable abstract nextValueSeed>(seed: V): Nullable nextEntrySeed, V extends Deserialize>(kseed: K, vseed: V): Nullable<[TK, TV]> { const key = this.nextKeySeed(kseed) as Nullable if (key !== undefined) { const value = this.nextValueSeed(vseed) as Nullable if (value !== undefined) { return [key, value] } } } nextKey(): Nullable { return this.nextValueSeed(GenericSeed) } nextValue(): Nullable { return this.nextValueSeed(GenericSeed) } nextEntry(): Nullable<[K, V]> { return this.nextEntrySeed(GenericSeed, GenericSeed) } } export interface IterableAccess { nextElementSeed>(seed: I): Nullable nextElement(): Nullable sizeHint(): number } export abstract class DefaultIterableAccessImpl implements IterableAccess { abstract nextElementSeed>(seed: I): Nullable nextElement(): Nullable { return this.nextElementSeed(GenericSeed) } sizeHint(): number { return 0 } } export interface Visitor { visitString(value: string): T visitNumber(value: number): T visitBigInt(value: bigint): T visitBoolean(value: boolean): T visitSymbol(value: symbol): T visitNull(): T visitObject(value: MapAccess): T visitClass(name: string, value: MapAccess): T visitIterable?(value: IterableAccess): T } export interface Deserializer { deserializeAny>(visitor: V): T deserializeString>(visitor: V): T deserializeNumber>(visitor: V): T deserializeBigInt>(visitor: V): T deserializeBoolean>(visitor: V): T deserializeSymbol>(visitor: V): T deserializeNull>(visitor: V): T deserializeObject>(visitor: V): T deserializeClass>(name: string, visitor: V): T deserializeIterable>(visitor: V): T } export interface Deserialize { deserialize(deserializer: D): T }