import type { EncoderState } from "./encoder"; import type { DecoderState } from "./decoder"; import type { Value } from "./values"; export type PointerTypeEncode = { encode(s: EncoderState, v: T): void; toValue(v: T): Value; } export type PointerTypeDecode = { decode(s: DecoderState): T; fromValue(v: Value): T; } export type PointerType = PointerTypeEncode & PointerTypeDecode; export class Pointer { embeddedValue: T; constructor(embeddedValue: T) { this.embeddedValue = embeddedValue; } equals(other: any, is: (a: any, b: any) => boolean) { return isPointer(other) && is(this.embeddedValue, other.embeddedValue); } asPreservesText(): string { return '#!' + (this.embeddedValue as any).asPreservesText(); } } export function embed(embeddedValue: T): Pointer { return new Pointer(embeddedValue); } export function isPointer(v: Value): v is Pointer { return typeof v === 'object' && 'embeddedValue' in v; } export class GenericPointer { generic: Value; constructor(generic: Value) { this.generic = generic; } equals(other: any, is: (a: any, b: any) => boolean) { return typeof other === 'object' && 'generic' in other && is(this.generic, other.generic); } asPreservesText(): string { return this.generic.asPreservesText(); } }