preserves/implementations/javascript/packages/core/src/embedded.ts

57 lines
1.5 KiB
TypeScript
Raw Normal View History

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