import type { EncoderState } from "./encoder"; import type { DecoderState } from "./decoder"; import type { Value } from "./values"; import { ReaderStateOptions } from "./reader"; export type EmbeddedTypeEncode = { encode(s: EncoderState, v: T): void; toValue(v: T): Value; } export type EmbeddedTypeDecode = { decode(s: DecoderState): T; fromValue(v: Value, options: ReaderStateOptions): T; } export type EmbeddedType = EmbeddedTypeEncode & EmbeddedTypeDecode; export class Embedded { embeddedValue: T; constructor(embeddedValue: T) { this.embeddedValue = embeddedValue; } equals(other: any, is: (a: any, b: any) => boolean) { return isEmbedded(other) && is(this.embeddedValue, other.embeddedValue); } asPreservesText(): string { return '#!' + (this.embeddedValue as any).asPreservesText(); } } export function embed(embeddedValue: T): Embedded { return new Embedded(embeddedValue); } export function isEmbedded(v: Value): v is Embedded { return typeof v === 'object' && 'embeddedValue' in v; } export class GenericEmbedded { 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(); } }