import type { DecoderState } from "./decoder"; import type { EncoderState } from "./encoder"; import type { Value } from "./values"; import { ReaderStateOptions } from "./reader"; export type EmbeddedTypeEncode = { encode(s: EncoderState, v: T): void; } 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); } toString(): string { return '#:' + (this.embeddedValue as any).toString(); } __as_preserve__(): T extends R ? Value : never { return this as any; } static __from_preserve__(v: Value): undefined | Embedded { return isEmbedded(v) ? v : void 0; } } 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); } toString(): string { return this.generic.toString(); } }