diff --git a/implementations/javascript/packages/schema/src/compiler.ts b/implementations/javascript/packages/schema/src/compiler.ts index 0ecc0d2..a3435df 100644 --- a/implementations/javascript/packages/schema/src/compiler.ts +++ b/implementations/javascript/packages/schema/src/compiler.ts @@ -1,10 +1,10 @@ import { encode, stringify } from "@preserves/core"; import * as M from "./meta"; import { CompilerOptions, ModuleContext } from "./compiler/context"; -import { Formatter, block, seq, braces, opseq } from "./compiler/block"; +import { Formatter, block, seq, braces } from "./compiler/block"; import { typeForDefinition } from "./compiler/gentype"; import { converterForDefinition } from "./compiler/genconverter"; -import { renderType } from "./compiler/rendertype"; +import { renderTypeWithConversionMixins } from "./compiler/rendertype"; import { genConstructor } from "./compiler/genctor"; import { unconverterForDefinition } from "./compiler/genunconverter"; import { sourceCodeFor } from "./compiler/value"; @@ -32,10 +32,10 @@ export function compile( for (const [name, def] of schema.definitions) { const t = typeForDefinition(mod.resolver(), def); const nameStr = stringify(name); - const resultTypeItem = mod.withAsPreserveMixinType(nameStr, t); + const resultTypeItem = seq(nameStr, mod.genericArgsFor(t)); mod.defineType(seq(`export type ${nameStr}`, mod.genericParametersFor(t), - ` = `, renderType(mod, t), `;`)); + ` = `, renderTypeWithConversionMixins(mod, t), `;`)); if (t.kind === 'union') { mod.defineFunctions(nameStr, _ctx => @@ -53,7 +53,7 @@ export function compile( const t = typeForDefinition(mod.resolver(), def); const name = name0 as symbol; const nameStr = name0.description!; - const resultTypeItem = mod.withAsPreserveMixinType(nameStr, t); + const resultTypeItem = seq(nameStr, mod.genericArgsFor(t)); mod.defineFunctions(nameStr, ctx => [seq(`export function as${name.description!}`, mod.genericParameters(), diff --git a/implementations/javascript/packages/schema/src/compiler/context.ts b/implementations/javascript/packages/schema/src/compiler/context.ts index 9324d97..494dbae 100644 --- a/implementations/javascript/packages/schema/src/compiler/context.ts +++ b/implementations/javascript/packages/schema/src/compiler/context.ts @@ -1,7 +1,7 @@ import { Dictionary, KeyedSet, FlexSet, Position, stringify } from "@preserves/core"; import { refPosition } from "../reader"; import * as M from "../meta"; -import { anglebrackets, block, braces, commas, formatItems, Item, keyvalue, seq, opseq } from "./block"; +import { anglebrackets, block, braces, commas, formatItems, Item, keyvalue, seq } from "./block"; import { ANY_TYPE, RefType, Type } from "./type"; import { renderType, variantInitFor } from "./rendertype"; import { typeForDefinition } from "./gentype"; @@ -97,7 +97,7 @@ export class ModuleContext { return (ref) => this.lookup( ref, (_p, _t) => Type.ref(ref.name.description!, ref), - (modPath, modId, modFile, modExpr, _p, t) => { + (modPath, modId, modFile, modExpr, _p, _t) => { this.imports.add([modPath, modId, modFile, modExpr]); return Type.ref(`${modId}${modExpr}.${ref.name.description!}`, ref); }, @@ -209,19 +209,6 @@ export class ModuleContext { return walk(t); } - - withAsPreserveMixinType(name: string, t: Type): Item { - if (t.kind === 'unit' || t.kind === 'record' || t.kind === 'union') { - return opseq('any', ' & ', - seq(name, this.genericArgsFor(t)), - braces(seq('__as_preserve__', - this.hasEmbedded(t) ? '' : this.genericParameters(), - '()', - ': _.Value', this.genericArgs()))); - } else { - return seq(name, this.genericArgsFor(t)); - } - } } export class FunctionContext { @@ -285,16 +272,25 @@ export class FunctionContext { } buildCapturedCompound(dest: string): Item { - const fields = [ - ... variantInitFor(this.variantName), - ... this.captures.map(({ fieldName, sourceExpr }) => - keyvalue(fieldName, sourceExpr)), - seq(`__as_preserve__() `, block(`return from${this.definitionName}(this)`)) - ]; - return seq(`${dest} = `, braces(... fields)); + return seq(`${dest} = `, buildProduct( + this.definitionName, this.variantName, this.captures)); } } +export function buildProduct( + definitionName: string, + variant: string | undefined, + initializers: Capture[], +): Item { + return braces( + ... variantInitFor(variant), + ... initializers.map(({ fieldName, sourceExpr }) => keyvalue(fieldName, sourceExpr)), + seq(`__as_preserve__() `, block(`return from${M.jsId(definitionName)}(this)`)), + seq(`__preserve_on__(e) { e.push(from${M.jsId(definitionName)}(this)); }`), + seq(`__preserve_text_on__(w) { w.push(from${M.jsId(definitionName)}(this)); }`), + ); +} + export class WalkState { modulePath: M.ModulePath; readonly seen: FlexSet; diff --git a/implementations/javascript/packages/schema/src/compiler/genconverter.ts b/implementations/javascript/packages/schema/src/compiler/genconverter.ts index a8bc8ae..856a363 100644 --- a/implementations/javascript/packages/schema/src/compiler/genconverter.ts +++ b/implementations/javascript/packages/schema/src/compiler/genconverter.ts @@ -1,8 +1,9 @@ import { FunctionContext } from "./context"; import * as M from '../meta'; -import { Item, seq } from "./block"; +import { Item, seq, parens, anglebrackets } from "./block"; import { simpleType, typeFor } from "./gentype"; import { ANY_TYPE, Type } from "./type"; +import { renderType } from "./rendertype"; export function converterForDefinition( ctx: FunctionContext, @@ -94,6 +95,31 @@ function converterForTuple(ctx: FunctionContext, : [seq(`if (_.isSequence(${src})`, lengthCheck, `) `, ctx.block(() => loop(0)))]; } +function encoderForSimplePattern( + ctx: FunctionContext, + p: M.SimplePattern, +): Item | null { + switch (p._variant) { + case 'Ref': + return ctx.mod.lookup( + p.value, + (_p, t) => `from${M.jsId(p.value.name.description!)}${ctx.mod.genericArgsFor(t())}`, + (modPath, modId, modFile, modExpr, _p, t) => { + ctx.mod.imports.add([modPath, modId, modFile, modExpr]); + return `${modId}${modExpr}.from${M.jsId(p.value.name.description!)}${t ? ctx.mod.genericArgsFor(t()) : ''}`; + }); + case 'embedded': + return `_.embed`; + case 'seqof': { + const e = encoderForSimplePattern(ctx, p.pattern); + if (e === null) return null; + return seq(`vs => vs.map`, parens(e)); + } + default: + return null; + } +} + function converterFor( ctx: FunctionContext, np: M.NamedPattern, @@ -163,9 +189,12 @@ export function converterForSimple( case 'setof': return [`${dest} = void 0`, seq(`if (_.Set.isSet<_embedded>(${src})) `, ctx.block(() => { + const vt = simpleType(ctx.mod.resolver(), p.pattern); const v = ctx.gentempname(); return [ - seq(`${dest} = new _.KeyedSet()`), + seq(`${dest} = new _.EncodableSet`, + anglebrackets(renderType(ctx.mod, vt), '_embedded'), + parens(encoderForSimplePattern(ctx, p.pattern) ?? `v => v`)), seq(`for (const ${v} of ${src}) `, ctx.block(() => [ ... converterFor(ctx, M.anonymousSimplePattern(p.pattern), v, vv => [`${dest}.add(${vv})`, `continue`]), @@ -175,10 +204,16 @@ export function converterForSimple( case 'dictof': return [`${dest} = void 0`, seq(`if (_.Dictionary.isDictionary<_embedded>(${src})) `, ctx.block(() => { - const v = ctx.gentempname(); + const resolver = ctx.mod.resolver(); + const kt = simpleType(resolver, p.key); + const vt = simpleType(resolver, p.value); const k = ctx.gentempname(); + const v = ctx.gentempname(); return [ - seq(`${dest} = new _.KeyedDictionary()`), + seq(`${dest} = new _.EncodableDictionary`, + anglebrackets(renderType(ctx.mod, kt), renderType(ctx.mod, vt), '_embedded'), + parens(encoderForSimplePattern(ctx, p.key) ?? `k => k`, + encoderForSimplePattern(ctx, p.value) ?? `v => v`)), seq(`for (const [${k}, ${v}] of ${src}) `, ctx.block(() => [ ... converterFor(ctx, M.anonymousSimplePattern(p.key), k, kk => converterFor(ctx, M.anonymousSimplePattern(p.value), v, vv => diff --git a/implementations/javascript/packages/schema/src/compiler/genctor.ts b/implementations/javascript/packages/schema/src/compiler/genctor.ts index 9bc3261..95f61d2 100644 --- a/implementations/javascript/packages/schema/src/compiler/genctor.ts +++ b/implementations/javascript/packages/schema/src/compiler/genctor.ts @@ -1,8 +1,8 @@ import * as M from '../meta'; -import { block, braces, Item, keyvalue, parens, seq } from "./block"; +import { block, braces, Item, parens, seq } from "./block"; import { FieldType, SimpleType, Type } from "./type"; import { renderType } from "./rendertype"; -import { ModuleContext } from './context'; +import { ModuleContext, buildProduct } from './context'; export function genConstructor( mod: ModuleContext, @@ -29,12 +29,7 @@ export function genConstructor( simpleValue = (variant === void 0) && (arg.kind !== 'unit'); } - const initializers: Item[] = (variant !== void 0) - ? [keyvalue('_variant', JSON.stringify(variant))] - : []; - formals.forEach(([n, _t]) => initializers.push(seq(JSON.stringify(n), ': ', M.jsId(n)))); - - initializers.push(seq(`__as_preserve__() `, block(`return from${M.jsId(definitionName)}(this)`))); + const initializers = formals.map(([n, _t]) => ({ fieldName: n, sourceExpr: M.jsId(n) })); const declArgs: Array = (formals.length > 1) ? [seq(braces(...formals.map(f => M.jsId(f[0]))), ': ', @@ -48,7 +43,7 @@ export function genConstructor( seq(`return `, (simpleValue ? 'value' - : braces(...initializers))))), + : buildProduct(definitionName, variant, initializers))))), seq(`${M.jsId(name)}.schema = function () `, block( seq(`return `, braces( `schema: _schema()`, diff --git a/implementations/javascript/packages/schema/src/compiler/rendertype.ts b/implementations/javascript/packages/schema/src/compiler/rendertype.ts index fc0adcc..9b99fe6 100644 --- a/implementations/javascript/packages/schema/src/compiler/rendertype.ts +++ b/implementations/javascript/packages/schema/src/compiler/rendertype.ts @@ -10,7 +10,7 @@ export function variantFor(variantName: string): Item { return keyvalue('_variant', JSON.stringify(variantName)); } -function simpleTypeFields(ctxt: ModuleContext, baseType: Type, t: SimpleType): Item[] { +function simpleTypeFields(ctxt: ModuleContext, t: SimpleType): Item[] { switch (t.kind) { case 'unit': return []; @@ -29,35 +29,49 @@ function simpleTypeFields(ctxt: ModuleContext, baseType: Type, t: SimpleType): I export function renderVariant( ctxt: ModuleContext, - baseType: Type, [variantName, t]: [string, SimpleType], ): Item { - let fields = simpleTypeFields(ctxt, baseType, t); + let fields = simpleTypeFields(ctxt, t); return braces(variantFor(variantName), ... fields); } export function renderType(ctxt: ModuleContext, t: Type): Item { switch (t.kind) { case 'union': return opseq('never', ' | ', ... - Array.from(t.variants).flatMap(entry => renderVariant(ctxt, t, entry))); - case 'unit': return braces(... simpleTypeFields(ctxt, t, t)); + Array.from(t.variants).flatMap(entry => renderVariant(ctxt, entry))); + case 'unit': return braces(... simpleTypeFields(ctxt, t)); case 'ref': if (t.ref === null && t.typeName === '_embedded') { return t.typeName; } else { return seq(t.typeName, ctxt.genericArgsFor(t)); } - case 'set': return seq('_.KeyedSet', anglebrackets( + case 'set': return seq('_.EncodableSet', anglebrackets( renderType(ctxt, t.type), '_embedded')); - case 'dictionary': return seq('_.KeyedDictionary', anglebrackets( + case 'dictionary': return seq('_.EncodableDictionary', anglebrackets( renderType(ctxt, t.key), renderType(ctxt, t.value), '_embedded')); case 'array': return seq('Array', anglebrackets(renderType(ctxt, t.type))); - case 'record': return braces(... simpleTypeFields(ctxt, t, t)); + case 'record': return braces(... simpleTypeFields(ctxt, t)); default: ((_: never) => {})(t); throw new Error("Unreachable"); } } + +export function renderTypeWithConversionMixins(ctxt: ModuleContext, t: Type): Item { + if (t.kind === 'unit' || t.kind === 'record' || t.kind === 'union') { + return opseq('any', ' & ', + renderType(ctxt, t), + seq('_.Preservable', ctxt.hasEmbedded(t) ? ctxt.genericArgs() : ''), + seq('_.PreserveWritable', ctxt.hasEmbedded(t) ? ctxt.genericArgs() : ''), + braces(seq('__as_preserve__', + ctxt.hasEmbedded(t) ? '' : ctxt.genericParameters(), + '()', + ': _.Value', ctxt.genericArgs()))); + } else { + return renderType(ctxt, t); + } +} diff --git a/implementations/javascript/packages/schema/src/gen/schema.ts b/implementations/javascript/packages/schema/src/gen/schema.ts index 1a33182..86ad3f3 100644 --- a/implementations/javascript/packages/schema/src/gen/schema.ts +++ b/implementations/javascript/packages/schema/src/gen/schema.ts @@ -42,111 +42,188 @@ export function _schema() { export const _imports = {} -export type Bundle<_embedded = _.GenericEmbedded> = {"modules": Modules<_embedded>}; +export type Bundle<_embedded = _.GenericEmbedded> = ( + {"modules": Modules<_embedded>} & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} +); -export type Modules<_embedded = _.GenericEmbedded> = _.KeyedDictionary, _embedded>; +export type Modules<_embedded = _.GenericEmbedded> = _.EncodableDictionary, _embedded>; -export type Schema<_embedded = _.GenericEmbedded> = { - "version": Version, - "embeddedType": EmbeddedTypeName, - "definitions": Definitions<_embedded> -}; +export type Schema<_embedded = _.GenericEmbedded> = ( + { + "version": Version, + "embeddedType": EmbeddedTypeName, + "definitions": Definitions<_embedded> + } & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} +); -export type Version = {}; +export type Version = ( + {} & + _.Preservable & + _.PreserveWritable & + {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} +); -export type EmbeddedTypeName = ({"_variant": "false"} | {"_variant": "Ref", "value": Ref}); +export type EmbeddedTypeName = ( + ({"_variant": "false"} | {"_variant": "Ref", "value": Ref}) & + _.Preservable & + _.PreserveWritable & + {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} +); -export type Definitions<_embedded = _.GenericEmbedded> = _.KeyedDictionary, _embedded>; +export type Definitions<_embedded = _.GenericEmbedded> = _.EncodableDictionary, _embedded>; export type Definition<_embedded = _.GenericEmbedded> = ( - { - "_variant": "or", - "pattern0": NamedAlternative<_embedded>, - "pattern1": NamedAlternative<_embedded>, - "patternN": Array> - } | - { - "_variant": "and", - "pattern0": NamedPattern<_embedded>, - "pattern1": NamedPattern<_embedded>, - "patternN": Array> - } | - {"_variant": "Pattern", "value": Pattern<_embedded>} + ( + { + "_variant": "or", + "pattern0": NamedAlternative<_embedded>, + "pattern1": NamedAlternative<_embedded>, + "patternN": Array> + } | + { + "_variant": "and", + "pattern0": NamedPattern<_embedded>, + "pattern1": NamedPattern<_embedded>, + "patternN": Array> + } | + {"_variant": "Pattern", "value": Pattern<_embedded>} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); export type Pattern<_embedded = _.GenericEmbedded> = ( - {"_variant": "SimplePattern", "value": SimplePattern<_embedded>} | - {"_variant": "CompoundPattern", "value": CompoundPattern<_embedded>} + ( + {"_variant": "SimplePattern", "value": SimplePattern<_embedded>} | + {"_variant": "CompoundPattern", "value": CompoundPattern<_embedded>} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); export type SimplePattern<_embedded = _.GenericEmbedded> = ( - {"_variant": "any"} | - {"_variant": "atom", "atomKind": AtomKind} | - {"_variant": "embedded", "interface": SimplePattern<_embedded>} | - {"_variant": "lit", "value": _.Value<_embedded>} | - {"_variant": "seqof", "pattern": SimplePattern<_embedded>} | - {"_variant": "setof", "pattern": SimplePattern<_embedded>} | - { - "_variant": "dictof", - "key": SimplePattern<_embedded>, - "value": SimplePattern<_embedded> - } | - {"_variant": "Ref", "value": Ref} + ( + {"_variant": "any"} | + {"_variant": "atom", "atomKind": AtomKind} | + {"_variant": "embedded", "interface": SimplePattern<_embedded>} | + {"_variant": "lit", "value": _.Value<_embedded>} | + {"_variant": "seqof", "pattern": SimplePattern<_embedded>} | + {"_variant": "setof", "pattern": SimplePattern<_embedded>} | + { + "_variant": "dictof", + "key": SimplePattern<_embedded>, + "value": SimplePattern<_embedded> + } | + {"_variant": "Ref", "value": Ref} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); export type CompoundPattern<_embedded = _.GenericEmbedded> = ( - { - "_variant": "rec", - "label": NamedPattern<_embedded>, - "fields": NamedPattern<_embedded> - } | - {"_variant": "tuple", "patterns": Array>} | - { - "_variant": "tuplePrefix", - "fixed": Array>, - "variable": NamedSimplePattern<_embedded> - } | - {"_variant": "dict", "entries": DictionaryEntries<_embedded>} + ( + { + "_variant": "rec", + "label": NamedPattern<_embedded>, + "fields": NamedPattern<_embedded> + } | + {"_variant": "tuple", "patterns": Array>} | + { + "_variant": "tuplePrefix", + "fixed": Array>, + "variable": NamedSimplePattern<_embedded> + } | + {"_variant": "dict", "entries": DictionaryEntries<_embedded>} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); -export type DictionaryEntries<_embedded = _.GenericEmbedded> = _.KeyedDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded>; +export type DictionaryEntries<_embedded = _.GenericEmbedded> = _.EncodableDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded>; export type AtomKind = ( - {"_variant": "Boolean"} | - {"_variant": "Float"} | - {"_variant": "Double"} | - {"_variant": "SignedInteger"} | - {"_variant": "String"} | - {"_variant": "ByteString"} | - {"_variant": "Symbol"} + ( + {"_variant": "Boolean"} | + {"_variant": "Float"} | + {"_variant": "Double"} | + {"_variant": "SignedInteger"} | + {"_variant": "String"} | + {"_variant": "ByteString"} | + {"_variant": "Symbol"} + ) & + _.Preservable & + _.PreserveWritable & + {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} ); -export type NamedAlternative<_embedded = _.GenericEmbedded> = {"variantLabel": string, "pattern": Pattern<_embedded>}; +export type NamedAlternative<_embedded = _.GenericEmbedded> = ( + {"variantLabel": string, "pattern": Pattern<_embedded>} & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} +); export type NamedSimplePattern<_embedded = _.GenericEmbedded> = ( - {"_variant": "named", "value": Binding<_embedded>} | - {"_variant": "anonymous", "value": SimplePattern<_embedded>} + ( + {"_variant": "named", "value": Binding<_embedded>} | + {"_variant": "anonymous", "value": SimplePattern<_embedded>} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); export type NamedPattern<_embedded = _.GenericEmbedded> = ( - {"_variant": "named", "value": Binding<_embedded>} | - {"_variant": "anonymous", "value": Pattern<_embedded>} + ( + {"_variant": "named", "value": Binding<_embedded>} | + {"_variant": "anonymous", "value": Pattern<_embedded>} + ) & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} ); -export type Binding<_embedded = _.GenericEmbedded> = {"name": symbol, "pattern": SimplePattern<_embedded>}; +export type Binding<_embedded = _.GenericEmbedded> = ( + {"name": symbol, "pattern": SimplePattern<_embedded>} & + _.Preservable<_embedded> & + _.PreserveWritable<_embedded> & + {__as_preserve__(): _.Value<_embedded>} +); -export type Ref = {"module": ModulePath, "name": symbol}; +export type Ref = ( + {"module": ModulePath, "name": symbol} & + _.Preservable & + _.PreserveWritable & + {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} +); export type ModulePath = Array; -export function Bundle<_embedded = _.GenericEmbedded>(modules: Modules<_embedded>): (Bundle<_embedded> & {__as_preserve__(): _.Value<_embedded>}) {return {"modules": modules, __as_preserve__() {return fromBundle(this);}};} +export function Bundle<_embedded = _.GenericEmbedded>(modules: Modules<_embedded>): Bundle<_embedded> { + return { + "modules": modules, + __as_preserve__() {return fromBundle(this);}, + __preserve_on__(e) { e.push(fromBundle(this)); }, + __preserve_text_on__(w) { w.push(fromBundle(this)); } + }; +} Bundle.schema = function () { return {schema: _schema(), imports: _imports, definitionName: _.Symbol.for("Bundle")}; } -export function Modules<_embedded = _.GenericEmbedded>(value: _.KeyedDictionary, _embedded>): Modules<_embedded> {return value;} +export function Modules<_embedded = _.GenericEmbedded>(value: _.EncodableDictionary, _embedded>): Modules<_embedded> {return value;} Modules.schema = function () { return {schema: _schema(), imports: _imports, definitionName: _.Symbol.for("Modules")}; @@ -158,12 +235,14 @@ export function Schema<_embedded = _.GenericEmbedded>( embeddedType: EmbeddedTypeName, definitions: Definitions<_embedded> } -): (Schema<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +): Schema<_embedded> { return { "version": version, "embeddedType": embeddedType, "definitions": definitions, - __as_preserve__() {return fromSchema(this);} + __as_preserve__() {return fromSchema(this);}, + __preserve_on__(e) { e.push(fromSchema(this)); }, + __preserve_text_on__(w) { w.push(fromSchema(this)); } }; } @@ -171,21 +250,26 @@ Schema.schema = function () { return {schema: _schema(), imports: _imports, definitionName: _.Symbol.for("Schema")}; } -export function Version(): ( - Version & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) {return {__as_preserve__() {return fromVersion(this);}};} +export function Version(): Version { + return { + __as_preserve__() {return fromVersion(this);}, + __preserve_on__(e) { e.push(fromVersion(this)); }, + __preserve_text_on__(w) { w.push(fromVersion(this)); } + }; +} Version.schema = function () { return {schema: _schema(), imports: _imports, definitionName: _.Symbol.for("Version")}; } export namespace EmbeddedTypeName { - export function $false(): ( - EmbeddedTypeName & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) { - return {"_variant": "false", __as_preserve__() {return fromEmbeddedTypeName(this);}}; + export function $false(): EmbeddedTypeName { + return { + "_variant": "false", + __as_preserve__() {return fromEmbeddedTypeName(this);}, + __preserve_on__(e) { e.push(fromEmbeddedTypeName(this)); }, + __preserve_text_on__(w) { w.push(fromEmbeddedTypeName(this)); } + }; }; $false.schema = function () { return { @@ -195,14 +279,13 @@ export namespace EmbeddedTypeName { variant: _.Symbol.for("false") }; }; - export function Ref(value: Ref): ( - EmbeddedTypeName & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) { + export function Ref(value: Ref): EmbeddedTypeName { return { "_variant": "Ref", "value": value, - __as_preserve__() {return fromEmbeddedTypeName(this);} + __as_preserve__() {return fromEmbeddedTypeName(this);}, + __preserve_on__(e) { e.push(fromEmbeddedTypeName(this)); }, + __preserve_text_on__(w) { w.push(fromEmbeddedTypeName(this)); } }; }; Ref.schema = function () { @@ -215,7 +298,7 @@ export namespace EmbeddedTypeName { }; } -export function Definitions<_embedded = _.GenericEmbedded>(value: _.KeyedDictionary, _embedded>): Definitions<_embedded> {return value;} +export function Definitions<_embedded = _.GenericEmbedded>(value: _.EncodableDictionary, _embedded>): Definitions<_embedded> {return value;} Definitions.schema = function () { return { @@ -232,13 +315,15 @@ export namespace Definition { pattern1: NamedAlternative<_embedded>, patternN: Array> } - ): (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + ): Definition<_embedded> { return { "_variant": "or", "pattern0": pattern0, "pattern1": pattern1, "patternN": patternN, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; or.schema = function () { @@ -255,13 +340,15 @@ export namespace Definition { pattern1: NamedPattern<_embedded>, patternN: Array> } - ): (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + ): Definition<_embedded> { return { "_variant": "and", "pattern0": pattern0, "pattern1": pattern1, "patternN": patternN, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; and.schema = function () { @@ -272,11 +359,13 @@ export namespace Definition { variant: _.Symbol.for("and") }; }; - export function Pattern<_embedded = _.GenericEmbedded>(value: Pattern<_embedded>): (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function Pattern<_embedded = _.GenericEmbedded>(value: Pattern<_embedded>): Definition<_embedded> { return { "_variant": "Pattern", "value": value, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; Pattern.schema = function () { @@ -290,11 +379,13 @@ export namespace Definition { } export namespace Pattern { - export function SimplePattern<_embedded = _.GenericEmbedded>(value: SimplePattern<_embedded>): (Pattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function SimplePattern<_embedded = _.GenericEmbedded>(value: SimplePattern<_embedded>): Pattern<_embedded> { return { "_variant": "SimplePattern", "value": value, - __as_preserve__() {return fromPattern(this);} + __as_preserve__() {return fromPattern(this);}, + __preserve_on__(e) { e.push(fromPattern(this)); }, + __preserve_text_on__(w) { w.push(fromPattern(this)); } }; }; SimplePattern.schema = function () { @@ -305,11 +396,13 @@ export namespace Pattern { variant: _.Symbol.for("SimplePattern") }; }; - export function CompoundPattern<_embedded = _.GenericEmbedded>(value: CompoundPattern<_embedded>): (Pattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function CompoundPattern<_embedded = _.GenericEmbedded>(value: CompoundPattern<_embedded>): Pattern<_embedded> { return { "_variant": "CompoundPattern", "value": value, - __as_preserve__() {return fromPattern(this);} + __as_preserve__() {return fromPattern(this);}, + __preserve_on__(e) { e.push(fromPattern(this)); }, + __preserve_text_on__(w) { w.push(fromPattern(this)); } }; }; CompoundPattern.schema = function () { @@ -323,8 +416,13 @@ export namespace Pattern { } export namespace SimplePattern { - export function any<_embedded = _.GenericEmbedded>(): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - return {"_variant": "any", __as_preserve__() {return fromSimplePattern(this);}}; + export function any<_embedded = _.GenericEmbedded>(): SimplePattern<_embedded> { + return { + "_variant": "any", + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } + }; }; any.schema = function () { return { @@ -334,11 +432,13 @@ export namespace SimplePattern { variant: _.Symbol.for("any") }; }; - export function atom<_embedded = _.GenericEmbedded>(atomKind: AtomKind): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function atom<_embedded = _.GenericEmbedded>(atomKind: AtomKind): SimplePattern<_embedded> { return { "_variant": "atom", "atomKind": atomKind, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; atom.schema = function () { @@ -349,11 +449,13 @@ export namespace SimplePattern { variant: _.Symbol.for("atom") }; }; - export function embedded<_embedded = _.GenericEmbedded>($interface: SimplePattern<_embedded>): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function embedded<_embedded = _.GenericEmbedded>($interface: SimplePattern<_embedded>): SimplePattern<_embedded> { return { "_variant": "embedded", "interface": $interface, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; embedded.schema = function () { @@ -364,11 +466,13 @@ export namespace SimplePattern { variant: _.Symbol.for("embedded") }; }; - export function lit<_embedded = _.GenericEmbedded>(value: _.Value<_embedded>): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function lit<_embedded = _.GenericEmbedded>(value: _.Value<_embedded>): SimplePattern<_embedded> { return { "_variant": "lit", "value": value, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; lit.schema = function () { @@ -379,11 +483,13 @@ export namespace SimplePattern { variant: _.Symbol.for("lit") }; }; - export function seqof<_embedded = _.GenericEmbedded>(pattern: SimplePattern<_embedded>): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function seqof<_embedded = _.GenericEmbedded>(pattern: SimplePattern<_embedded>): SimplePattern<_embedded> { return { "_variant": "seqof", "pattern": pattern, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; seqof.schema = function () { @@ -394,11 +500,13 @@ export namespace SimplePattern { variant: _.Symbol.for("seqof") }; }; - export function setof<_embedded = _.GenericEmbedded>(pattern: SimplePattern<_embedded>): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function setof<_embedded = _.GenericEmbedded>(pattern: SimplePattern<_embedded>): SimplePattern<_embedded> { return { "_variant": "setof", "pattern": pattern, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; setof.schema = function () { @@ -409,12 +517,14 @@ export namespace SimplePattern { variant: _.Symbol.for("setof") }; }; - export function dictof<_embedded = _.GenericEmbedded>({key, value}: {key: SimplePattern<_embedded>, value: SimplePattern<_embedded>}): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function dictof<_embedded = _.GenericEmbedded>({key, value}: {key: SimplePattern<_embedded>, value: SimplePattern<_embedded>}): SimplePattern<_embedded> { return { "_variant": "dictof", "key": key, "value": value, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; dictof.schema = function () { @@ -425,11 +535,13 @@ export namespace SimplePattern { variant: _.Symbol.for("dictof") }; }; - export function Ref<_embedded = _.GenericEmbedded>(value: Ref): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function Ref<_embedded = _.GenericEmbedded>(value: Ref): SimplePattern<_embedded> { return { "_variant": "Ref", "value": value, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; Ref.schema = function () { @@ -445,12 +557,14 @@ export namespace SimplePattern { export namespace CompoundPattern { export function rec<_embedded = _.GenericEmbedded>( {label, fields}: {label: NamedPattern<_embedded>, fields: NamedPattern<_embedded>} - ): (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + ): CompoundPattern<_embedded> { return { "_variant": "rec", "label": label, "fields": fields, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; rec.schema = function () { @@ -461,11 +575,13 @@ export namespace CompoundPattern { variant: _.Symbol.for("rec") }; }; - export function tuple<_embedded = _.GenericEmbedded>(patterns: Array>): (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function tuple<_embedded = _.GenericEmbedded>(patterns: Array>): CompoundPattern<_embedded> { return { "_variant": "tuple", "patterns": patterns, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; tuple.schema = function () { @@ -478,12 +594,14 @@ export namespace CompoundPattern { }; export function tuplePrefix<_embedded = _.GenericEmbedded>( {fixed, variable}: {fixed: Array>, variable: NamedSimplePattern<_embedded>} - ): (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + ): CompoundPattern<_embedded> { return { "_variant": "tuplePrefix", "fixed": fixed, "variable": variable, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; tuplePrefix.schema = function () { @@ -494,11 +612,13 @@ export namespace CompoundPattern { variant: _.Symbol.for("tuplePrefix") }; }; - export function dict<_embedded = _.GenericEmbedded>(entries: DictionaryEntries<_embedded>): (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function dict<_embedded = _.GenericEmbedded>(entries: DictionaryEntries<_embedded>): CompoundPattern<_embedded> { return { "_variant": "dict", "entries": entries, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; dict.schema = function () { @@ -512,7 +632,7 @@ export namespace CompoundPattern { } export function DictionaryEntries<_embedded = _.GenericEmbedded>( - value: _.KeyedDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded> + value: _.EncodableDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded> ): DictionaryEntries<_embedded> {return value;} DictionaryEntries.schema = function () { @@ -524,11 +644,13 @@ DictionaryEntries.schema = function () { } export namespace AtomKind { - export function Boolean(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) { - return {"_variant": "Boolean", __as_preserve__() {return fromAtomKind(this);}}; + export function Boolean(): AtomKind { + return { + "_variant": "Boolean", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; Boolean.schema = function () { return { @@ -538,10 +660,14 @@ export namespace AtomKind { variant: _.Symbol.for("Boolean") }; }; - export function Float(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) {return {"_variant": "Float", __as_preserve__() {return fromAtomKind(this);}};}; + export function Float(): AtomKind { + return { + "_variant": "Float", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; + }; Float.schema = function () { return { schema: _schema(), @@ -550,10 +676,14 @@ export namespace AtomKind { variant: _.Symbol.for("Float") }; }; - export function Double(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) {return {"_variant": "Double", __as_preserve__() {return fromAtomKind(this);}};}; + export function Double(): AtomKind { + return { + "_variant": "Double", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; + }; Double.schema = function () { return { schema: _schema(), @@ -562,11 +692,13 @@ export namespace AtomKind { variant: _.Symbol.for("Double") }; }; - export function SignedInteger(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) { - return {"_variant": "SignedInteger", __as_preserve__() {return fromAtomKind(this);}}; + export function SignedInteger(): AtomKind { + return { + "_variant": "SignedInteger", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; SignedInteger.schema = function () { return { @@ -576,10 +708,14 @@ export namespace AtomKind { variant: _.Symbol.for("SignedInteger") }; }; - export function String(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) {return {"_variant": "String", __as_preserve__() {return fromAtomKind(this);}};}; + export function String(): AtomKind { + return { + "_variant": "String", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; + }; String.schema = function () { return { schema: _schema(), @@ -588,11 +724,13 @@ export namespace AtomKind { variant: _.Symbol.for("String") }; }; - export function ByteString(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) { - return {"_variant": "ByteString", __as_preserve__() {return fromAtomKind(this);}}; + export function ByteString(): AtomKind { + return { + "_variant": "ByteString", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; ByteString.schema = function () { return { @@ -602,10 +740,14 @@ export namespace AtomKind { variant: _.Symbol.for("ByteString") }; }; - export function Symbol(): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ) {return {"_variant": "Symbol", __as_preserve__() {return fromAtomKind(this);}};}; + export function Symbol(): AtomKind { + return { + "_variant": "Symbol", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; + }; Symbol.schema = function () { return { schema: _schema(), @@ -616,11 +758,13 @@ export namespace AtomKind { }; } -export function NamedAlternative<_embedded = _.GenericEmbedded>({variantLabel, pattern}: {variantLabel: string, pattern: Pattern<_embedded>}): (NamedAlternative<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function NamedAlternative<_embedded = _.GenericEmbedded>({variantLabel, pattern}: {variantLabel: string, pattern: Pattern<_embedded>}): NamedAlternative<_embedded> { return { "variantLabel": variantLabel, "pattern": pattern, - __as_preserve__() {return fromNamedAlternative(this);} + __as_preserve__() {return fromNamedAlternative(this);}, + __preserve_on__(e) { e.push(fromNamedAlternative(this)); }, + __preserve_text_on__(w) { w.push(fromNamedAlternative(this)); } }; } @@ -633,11 +777,13 @@ NamedAlternative.schema = function () { } export namespace NamedSimplePattern { - export function named<_embedded = _.GenericEmbedded>(value: Binding<_embedded>): (NamedSimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function named<_embedded = _.GenericEmbedded>(value: Binding<_embedded>): NamedSimplePattern<_embedded> { return { "_variant": "named", "value": value, - __as_preserve__() {return fromNamedSimplePattern(this);} + __as_preserve__() {return fromNamedSimplePattern(this);}, + __preserve_on__(e) { e.push(fromNamedSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedSimplePattern(this)); } }; }; named.schema = function () { @@ -648,11 +794,13 @@ export namespace NamedSimplePattern { variant: _.Symbol.for("named") }; }; - export function anonymous<_embedded = _.GenericEmbedded>(value: SimplePattern<_embedded>): (NamedSimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function anonymous<_embedded = _.GenericEmbedded>(value: SimplePattern<_embedded>): NamedSimplePattern<_embedded> { return { "_variant": "anonymous", "value": value, - __as_preserve__() {return fromNamedSimplePattern(this);} + __as_preserve__() {return fromNamedSimplePattern(this);}, + __preserve_on__(e) { e.push(fromNamedSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedSimplePattern(this)); } }; }; anonymous.schema = function () { @@ -666,11 +814,13 @@ export namespace NamedSimplePattern { } export namespace NamedPattern { - export function named<_embedded = _.GenericEmbedded>(value: Binding<_embedded>): (NamedPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function named<_embedded = _.GenericEmbedded>(value: Binding<_embedded>): NamedPattern<_embedded> { return { "_variant": "named", "value": value, - __as_preserve__() {return fromNamedPattern(this);} + __as_preserve__() {return fromNamedPattern(this);}, + __preserve_on__(e) { e.push(fromNamedPattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedPattern(this)); } }; }; named.schema = function () { @@ -681,11 +831,13 @@ export namespace NamedPattern { variant: _.Symbol.for("named") }; }; - export function anonymous<_embedded = _.GenericEmbedded>(value: Pattern<_embedded>): (NamedPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { + export function anonymous<_embedded = _.GenericEmbedded>(value: Pattern<_embedded>): NamedPattern<_embedded> { return { "_variant": "anonymous", "value": value, - __as_preserve__() {return fromNamedPattern(this);} + __as_preserve__() {return fromNamedPattern(this);}, + __preserve_on__(e) { e.push(fromNamedPattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedPattern(this)); } }; }; anonymous.schema = function () { @@ -698,11 +850,13 @@ export namespace NamedPattern { }; } -export function Binding<_embedded = _.GenericEmbedded>({name, pattern}: {name: symbol, pattern: SimplePattern<_embedded>}): (Binding<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function Binding<_embedded = _.GenericEmbedded>({name, pattern}: {name: symbol, pattern: SimplePattern<_embedded>}): Binding<_embedded> { return { "name": name, "pattern": pattern, - __as_preserve__() {return fromBinding(this);} + __as_preserve__() {return fromBinding(this);}, + __preserve_on__(e) { e.push(fromBinding(this)); }, + __preserve_text_on__(w) { w.push(fromBinding(this)); } }; } @@ -710,8 +864,14 @@ Binding.schema = function () { return {schema: _schema(), imports: _imports, definitionName: _.Symbol.for("Binding")}; } -export function Ref({module, name}: {module: ModulePath, name: symbol}): (Ref & {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>}) { - return {"module": module, "name": name, __as_preserve__() {return fromRef(this);}}; +export function Ref({module, name}: {module: ModulePath, name: symbol}): Ref { + return { + "module": module, + "name": name, + __as_preserve__() {return fromRef(this);}, + __preserve_on__(e) { e.push(fromRef(this)); }, + __preserve_text_on__(w) { w.push(fromRef(this)); } + }; } Ref.schema = function () { @@ -728,21 +888,28 @@ ModulePath.schema = function () { }; } -export function asBundle<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Bundle<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asBundle<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Bundle<_embedded> { let result = toBundle(v); if (result === void 0) throw new TypeError(`Invalid Bundle: ${_.stringify(v)}`); return result; } -export function toBundle<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Bundle<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (Bundle<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toBundle<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Bundle<_embedded> { + let result: undefined | Bundle<_embedded>; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $bundle) ? {} : void 0; if (_tmp0 !== void 0) { let _tmp1: (Modules<_embedded>) | undefined; _tmp1 = toModules(v[0]); - if (_tmp1 !== void 0) {result = {"modules": _tmp1, __as_preserve__() {return fromBundle(this);}};}; + if (_tmp1 !== void 0) { + result = { + "modules": _tmp1, + __as_preserve__() {return fromBundle(this);}, + __preserve_on__(e) { e.push(fromBundle(this)); }, + __preserve_text_on__(w) { w.push(fromBundle(this)); } + }; + }; }; }; return result; @@ -759,17 +926,17 @@ export function asModules<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): } export function toModules<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Modules<_embedded> { - let _tmp0: (_.KeyedDictionary, _embedded>) | undefined; + let _tmp0: (_.EncodableDictionary, _embedded>) | undefined; let result: undefined | Modules<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - _tmp0 = new _.KeyedDictionary(); - for (const [_tmp2, _tmp1] of v) { + _tmp0 = new _.EncodableDictionary, _embedded>(fromModulePath, fromSchema<_embedded>); + for (const [_tmp1, _tmp2] of v) { let _tmp3: (ModulePath) | undefined; - _tmp3 = toModulePath(_tmp2); + _tmp3 = toModulePath(_tmp1); if (_tmp3 !== void 0) { let _tmp4: (Schema<_embedded>) | undefined; - _tmp4 = toSchema(_tmp1); + _tmp4 = toSchema(_tmp2); if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; }; _tmp0 = void 0; @@ -788,14 +955,14 @@ export function fromModules<_embedded = _.GenericEmbedded>(_v: Modules<_embedded ); } -export function asSchema<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Schema<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asSchema<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Schema<_embedded> { let result = toSchema(v); if (result === void 0) throw new TypeError(`Invalid Schema: ${_.stringify(v)}`); return result; } -export function toSchema<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Schema<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (Schema<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toSchema<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Schema<_embedded> { + let result: undefined | Schema<_embedded>; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $schema) ? {} : void 0; @@ -820,7 +987,9 @@ export function toSchema<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): "version": _tmp2, "embeddedType": _tmp4, "definitions": _tmp6, - __as_preserve__() {return fromSchema(this);} + __as_preserve__() {return fromSchema(this);}, + __preserve_on__(e) { e.push(fromSchema(this)); }, + __preserve_text_on__(w) { w.push(fromSchema(this)); } }; }; }; @@ -851,26 +1020,23 @@ export function fromSchema<_embedded = _.GenericEmbedded>(_v: Schema<_embedded>) ); } -export function asVersion<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): ( - Version & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function asVersion<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Version { let result = toVersion(v); if (result === void 0) throw new TypeError(`Invalid Version: ${_.stringify(v)}`); return result; } -export function toVersion<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | ( - Version & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function toVersion<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Version { let _tmp0: ({}) | undefined; - let result: undefined | ( - Version & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ); + let result: undefined | Version; _tmp0 = _.is(v, $1) ? {} : void 0; - if (_tmp0 !== void 0) {result = {__as_preserve__() {return fromVersion(this);}};}; + if (_tmp0 !== void 0) { + result = { + __as_preserve__() {return fromVersion(this);}, + __preserve_on__(e) { e.push(fromVersion(this)); }, + __preserve_text_on__(w) { w.push(fromVersion(this)); } + }; + }; return result; } @@ -878,27 +1044,23 @@ Version.__from_preserve__ = toVersion; export function fromVersion<_embedded = _.GenericEmbedded>(_v: Version): _.Value<_embedded> {return $1;} -export function asEmbeddedTypeName<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): ( - EmbeddedTypeName & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function asEmbeddedTypeName<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): EmbeddedTypeName { let result = toEmbeddedTypeName(v); if (result === void 0) throw new TypeError(`Invalid EmbeddedTypeName: ${_.stringify(v)}`); return result; } -export function toEmbeddedTypeName<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | ( - EmbeddedTypeName & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function toEmbeddedTypeName<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | EmbeddedTypeName { let _tmp0: ({}) | undefined; - let result: undefined | ( - EmbeddedTypeName & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ); + let result: undefined | EmbeddedTypeName; _tmp0 = _.is(v, __lit6) ? {} : void 0; if (_tmp0 !== void 0) { - result = {"_variant": "false", __as_preserve__() {return fromEmbeddedTypeName(this);}}; + result = { + "_variant": "false", + __as_preserve__() {return fromEmbeddedTypeName(this);}, + __preserve_on__(e) { e.push(fromEmbeddedTypeName(this)); }, + __preserve_text_on__(w) { w.push(fromEmbeddedTypeName(this)); } + }; }; if (result === void 0) { let _tmp1: (Ref) | undefined; @@ -907,7 +1069,9 @@ export function toEmbeddedTypeName<_embedded = _.GenericEmbedded>(v: _.Value<_em result = { "_variant": "Ref", "value": _tmp1, - __as_preserve__() {return fromEmbeddedTypeName(this);} + __as_preserve__() {return fromEmbeddedTypeName(this);}, + __preserve_on__(e) { e.push(fromEmbeddedTypeName(this)); }, + __preserve_text_on__(w) { w.push(fromEmbeddedTypeName(this)); } }; }; }; @@ -930,17 +1094,17 @@ export function asDefinitions<_embedded = _.GenericEmbedded>(v: _.Value<_embedde } export function toDefinitions<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Definitions<_embedded> { - let _tmp0: (_.KeyedDictionary, _embedded>) | undefined; + let _tmp0: (_.EncodableDictionary, _embedded>) | undefined; let result: undefined | Definitions<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - _tmp0 = new _.KeyedDictionary(); - for (const [_tmp2, _tmp1] of v) { + _tmp0 = new _.EncodableDictionary, _embedded>(k => k, fromDefinition<_embedded>); + for (const [_tmp1, _tmp2] of v) { let _tmp3: (symbol) | undefined; - _tmp3 = typeof _tmp2 === 'symbol' ? _tmp2 : void 0; + _tmp3 = typeof _tmp1 === 'symbol' ? _tmp1 : void 0; if (_tmp3 !== void 0) { let _tmp4: (Definition<_embedded>) | undefined; - _tmp4 = toDefinition(_tmp1); + _tmp4 = toDefinition(_tmp2); if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; }; _tmp0 = void 0; @@ -957,14 +1121,14 @@ export function fromDefinitions<_embedded = _.GenericEmbedded>(_v: Definitions<_ return new _.Dictionary<_embedded>(_.Array.from(_v.entries()).map(([k, v]) => [k, fromDefinition<_embedded>(v)])); } -export function asDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Definition<_embedded> { let result = toDefinition(v); if (result === void 0) throw new TypeError(`Invalid Definition: ${_.stringify(v)}`); return result; } -export function toDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (Definition<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Definition<_embedded> { + let result: undefined | Definition<_embedded>; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $or) ? {} : void 0; @@ -993,7 +1157,9 @@ export function toDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded "pattern0": _tmp1, "pattern1": _tmp2, "patternN": _tmp4, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; }; @@ -1030,7 +1196,9 @@ export function toDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded "pattern0": _tmp8, "pattern1": _tmp9, "patternN": _tmp11, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; }; @@ -1045,7 +1213,9 @@ export function toDefinition<_embedded = _.GenericEmbedded>(v: _.Value<_embedded result = { "_variant": "Pattern", "value": _tmp14, - __as_preserve__() {return fromDefinition(this);} + __as_preserve__() {return fromDefinition(this);}, + __preserve_on__(e) { e.push(fromDefinition(this)); }, + __preserve_text_on__(w) { w.push(fromDefinition(this)); } }; }; }; @@ -1085,21 +1255,23 @@ export function fromDefinition<_embedded = _.GenericEmbedded>(_v: Definition<_em }; } -export function asPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Pattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Pattern<_embedded> { let result = toPattern(v); if (result === void 0) throw new TypeError(`Invalid Pattern: ${_.stringify(v)}`); return result; } -export function toPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Pattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function toPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Pattern<_embedded> { let _tmp0: (SimplePattern<_embedded>) | undefined; - let result: undefined | (Pattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}); + let result: undefined | Pattern<_embedded>; _tmp0 = toSimplePattern(v); if (_tmp0 !== void 0) { result = { "_variant": "SimplePattern", "value": _tmp0, - __as_preserve__() {return fromPattern(this);} + __as_preserve__() {return fromPattern(this);}, + __preserve_on__(e) { e.push(fromPattern(this)); }, + __preserve_text_on__(w) { w.push(fromPattern(this)); } }; }; if (result === void 0) { @@ -1109,7 +1281,9 @@ export function toPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): result = { "_variant": "CompoundPattern", "value": _tmp1, - __as_preserve__() {return fromPattern(this);} + __as_preserve__() {return fromPattern(this);}, + __preserve_on__(e) { e.push(fromPattern(this)); }, + __preserve_text_on__(w) { w.push(fromPattern(this)); } }; }; }; @@ -1125,18 +1299,23 @@ export function fromPattern<_embedded = _.GenericEmbedded>(_v: Pattern<_embedded }; } -export function asSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): SimplePattern<_embedded> { let result = toSimplePattern(v); if (result === void 0) throw new TypeError(`Invalid SimplePattern: ${_.stringify(v)}`); return result; } -export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | SimplePattern<_embedded> { let _tmp0: ({}) | undefined; - let result: undefined | (SimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}); + let result: undefined | SimplePattern<_embedded>; _tmp0 = _.is(v, $any) ? {} : void 0; if (_tmp0 !== void 0) { - result = {"_variant": "any", __as_preserve__() {return fromSimplePattern(this);}}; + result = { + "_variant": "any", + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } + }; }; if (result === void 0) { if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { @@ -1149,7 +1328,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "atom", "atomKind": _tmp2, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1165,7 +1346,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "embedded", "interface": _tmp4, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1181,7 +1364,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "lit", "value": _tmp6, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1197,7 +1382,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "seqof", "pattern": _tmp8, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1213,7 +1400,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "setof", "pattern": _tmp10, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1233,7 +1422,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed "_variant": "dictof", "key": _tmp12, "value": _tmp13, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1246,7 +1437,9 @@ export function toSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embed result = { "_variant": "Ref", "value": _tmp14, - __as_preserve__() {return fromSimplePattern(this);} + __as_preserve__() {return fromSimplePattern(this);}, + __preserve_on__(e) { e.push(fromSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromSimplePattern(this)); } }; }; }; @@ -1282,14 +1475,14 @@ export function fromSimplePattern<_embedded = _.GenericEmbedded>(_v: SimplePatte }; } -export function asCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): CompoundPattern<_embedded> { let result = toCompoundPattern(v); if (result === void 0) throw new TypeError(`Invalid CompoundPattern: ${_.stringify(v)}`); return result; } -export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (CompoundPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | CompoundPattern<_embedded> { + let result: undefined | CompoundPattern<_embedded>; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $rec) ? {} : void 0; @@ -1304,7 +1497,9 @@ export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_emb "_variant": "rec", "label": _tmp1, "fields": _tmp2, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; }; @@ -1331,7 +1526,9 @@ export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_emb result = { "_variant": "tuple", "patterns": _tmp4, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; }; @@ -1361,7 +1558,9 @@ export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_emb "_variant": "tuplePrefix", "fixed": _tmp8, "variable": _tmp11, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; }; @@ -1378,7 +1577,9 @@ export function toCompoundPattern<_embedded = _.GenericEmbedded>(v: _.Value<_emb result = { "_variant": "dict", "entries": _tmp13, - __as_preserve__() {return fromCompoundPattern(this);} + __as_preserve__() {return fromCompoundPattern(this);}, + __preserve_on__(e) { e.push(fromCompoundPattern(this)); }, + __preserve_text_on__(w) { w.push(fromCompoundPattern(this)); } }; }; }; @@ -1425,17 +1626,17 @@ export function asDictionaryEntries<_embedded = _.GenericEmbedded>(v: _.Value<_e } export function toDictionaryEntries<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | DictionaryEntries<_embedded> { - let _tmp0: (_.KeyedDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded>) | undefined; + let _tmp0: (_.EncodableDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded>) | undefined; let result: undefined | DictionaryEntries<_embedded>; _tmp0 = void 0; if (_.Dictionary.isDictionary<_embedded>(v)) { - _tmp0 = new _.KeyedDictionary(); - for (const [_tmp2, _tmp1] of v) { + _tmp0 = new _.EncodableDictionary<_.Value<_embedded>, NamedSimplePattern<_embedded>, _embedded>(k => k, fromNamedSimplePattern<_embedded>); + for (const [_tmp1, _tmp2] of v) { let _tmp3: (_.Value<_embedded>) | undefined; - _tmp3 = _tmp2; + _tmp3 = _tmp1; if (_tmp3 !== void 0) { let _tmp4: (NamedSimplePattern<_embedded>) | undefined; - _tmp4 = toNamedSimplePattern(_tmp1); + _tmp4 = toNamedSimplePattern(_tmp2); if (_tmp4 !== void 0) {_tmp0.set(_tmp3, _tmp4); continue;}; }; _tmp0 = void 0; @@ -1454,63 +1655,89 @@ export function fromDictionaryEntries<_embedded = _.GenericEmbedded>(_v: Diction ); } -export function asAtomKind<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function asAtomKind<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): AtomKind { let result = toAtomKind(v); if (result === void 0) throw new TypeError(`Invalid AtomKind: ${_.stringify(v)}`); return result; } -export function toAtomKind<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} -) { +export function toAtomKind<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | AtomKind { let _tmp0: ({}) | undefined; - let result: undefined | ( - AtomKind & - {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>} - ); + let result: undefined | AtomKind; _tmp0 = _.is(v, $Boolean) ? {} : void 0; if (_tmp0 !== void 0) { - result = {"_variant": "Boolean", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "Boolean", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp1: ({}) | undefined; _tmp1 = _.is(v, $Float) ? {} : void 0; if (_tmp1 !== void 0) { - result = {"_variant": "Float", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "Float", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp2: ({}) | undefined; _tmp2 = _.is(v, $Double) ? {} : void 0; if (_tmp2 !== void 0) { - result = {"_variant": "Double", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "Double", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp3: ({}) | undefined; _tmp3 = _.is(v, $SignedInteger) ? {} : void 0; if (_tmp3 !== void 0) { - result = {"_variant": "SignedInteger", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "SignedInteger", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp4: ({}) | undefined; _tmp4 = _.is(v, $String) ? {} : void 0; if (_tmp4 !== void 0) { - result = {"_variant": "String", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "String", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp5: ({}) | undefined; _tmp5 = _.is(v, $ByteString) ? {} : void 0; if (_tmp5 !== void 0) { - result = {"_variant": "ByteString", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "ByteString", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; if (result === void 0) { let _tmp6: ({}) | undefined; _tmp6 = _.is(v, $Symbol) ? {} : void 0; if (_tmp6 !== void 0) { - result = {"_variant": "Symbol", __as_preserve__() {return fromAtomKind(this);}}; + result = { + "_variant": "Symbol", + __as_preserve__() {return fromAtomKind(this);}, + __preserve_on__(e) { e.push(fromAtomKind(this)); }, + __preserve_text_on__(w) { w.push(fromAtomKind(this)); } + }; }; }; }; @@ -1535,14 +1762,14 @@ export function fromAtomKind<_embedded = _.GenericEmbedded>(_v: AtomKind): _.Val }; } -export function asNamedAlternative<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (NamedAlternative<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asNamedAlternative<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): NamedAlternative<_embedded> { let result = toNamedAlternative(v); if (result === void 0) throw new TypeError(`Invalid NamedAlternative: ${_.stringify(v)}`); return result; } -export function toNamedAlternative<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (NamedAlternative<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (NamedAlternative<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toNamedAlternative<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | NamedAlternative<_embedded> { + let result: undefined | NamedAlternative<_embedded>; if (_.isSequence(v) && v.length === 2) { let _tmp0: (string) | undefined; _tmp0 = typeof v[0] === 'string' ? v[0] : void 0; @@ -1553,7 +1780,9 @@ export function toNamedAlternative<_embedded = _.GenericEmbedded>(v: _.Value<_em result = { "variantLabel": _tmp0, "pattern": _tmp1, - __as_preserve__() {return fromNamedAlternative(this);} + __as_preserve__() {return fromNamedAlternative(this);}, + __preserve_on__(e) { e.push(fromNamedAlternative(this)); }, + __preserve_text_on__(w) { w.push(fromNamedAlternative(this)); } }; }; }; @@ -1565,21 +1794,23 @@ NamedAlternative.__from_preserve__ = toNamedAlternative; export function fromNamedAlternative<_embedded = _.GenericEmbedded>(_v: NamedAlternative<_embedded>): _.Value<_embedded> {return [_v["variantLabel"], fromPattern<_embedded>(_v["pattern"])];} -export function asNamedSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (NamedSimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asNamedSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): NamedSimplePattern<_embedded> { let result = toNamedSimplePattern(v); if (result === void 0) throw new TypeError(`Invalid NamedSimplePattern: ${_.stringify(v)}`); return result; } -export function toNamedSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (NamedSimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function toNamedSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | NamedSimplePattern<_embedded> { let _tmp0: (Binding<_embedded>) | undefined; - let result: undefined | (NamedSimplePattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}); + let result: undefined | NamedSimplePattern<_embedded>; _tmp0 = toBinding(v); if (_tmp0 !== void 0) { result = { "_variant": "named", "value": _tmp0, - __as_preserve__() {return fromNamedSimplePattern(this);} + __as_preserve__() {return fromNamedSimplePattern(this);}, + __preserve_on__(e) { e.push(fromNamedSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedSimplePattern(this)); } }; }; if (result === void 0) { @@ -1589,7 +1820,9 @@ export function toNamedSimplePattern<_embedded = _.GenericEmbedded>(v: _.Value<_ result = { "_variant": "anonymous", "value": _tmp1, - __as_preserve__() {return fromNamedSimplePattern(this);} + __as_preserve__() {return fromNamedSimplePattern(this);}, + __preserve_on__(e) { e.push(fromNamedSimplePattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedSimplePattern(this)); } }; }; }; @@ -1605,21 +1838,23 @@ export function fromNamedSimplePattern<_embedded = _.GenericEmbedded>(_v: NamedS }; } -export function asNamedPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (NamedPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asNamedPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): NamedPattern<_embedded> { let result = toNamedPattern(v); if (result === void 0) throw new TypeError(`Invalid NamedPattern: ${_.stringify(v)}`); return result; } -export function toNamedPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (NamedPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function toNamedPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | NamedPattern<_embedded> { let _tmp0: (Binding<_embedded>) | undefined; - let result: undefined | (NamedPattern<_embedded> & {__as_preserve__(): _.Value<_embedded>}); + let result: undefined | NamedPattern<_embedded>; _tmp0 = toBinding(v); if (_tmp0 !== void 0) { result = { "_variant": "named", "value": _tmp0, - __as_preserve__() {return fromNamedPattern(this);} + __as_preserve__() {return fromNamedPattern(this);}, + __preserve_on__(e) { e.push(fromNamedPattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedPattern(this)); } }; }; if (result === void 0) { @@ -1629,7 +1864,9 @@ export function toNamedPattern<_embedded = _.GenericEmbedded>(v: _.Value<_embedd result = { "_variant": "anonymous", "value": _tmp1, - __as_preserve__() {return fromNamedPattern(this);} + __as_preserve__() {return fromNamedPattern(this);}, + __preserve_on__(e) { e.push(fromNamedPattern(this)); }, + __preserve_text_on__(w) { w.push(fromNamedPattern(this)); } }; }; }; @@ -1645,14 +1882,14 @@ export function fromNamedPattern<_embedded = _.GenericEmbedded>(_v: NamedPattern }; } -export function asBinding<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Binding<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { +export function asBinding<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Binding<_embedded> { let result = toBinding(v); if (result === void 0) throw new TypeError(`Invalid Binding: ${_.stringify(v)}`); return result; } -export function toBinding<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Binding<_embedded> & {__as_preserve__(): _.Value<_embedded>}) { - let result: undefined | (Binding<_embedded> & {__as_preserve__(): _.Value<_embedded>}); +export function toBinding<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Binding<_embedded> { + let result: undefined | Binding<_embedded>; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $named) ? {} : void 0; @@ -1663,7 +1900,13 @@ export function toBinding<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): let _tmp2: (SimplePattern<_embedded>) | undefined; _tmp2 = toSimplePattern(v[1]); if (_tmp2 !== void 0) { - result = {"name": _tmp1, "pattern": _tmp2, __as_preserve__() {return fromBinding(this);}}; + result = { + "name": _tmp1, + "pattern": _tmp2, + __as_preserve__() {return fromBinding(this);}, + __preserve_on__(e) { e.push(fromBinding(this)); }, + __preserve_text_on__(w) { w.push(fromBinding(this)); } + }; }; }; }; @@ -1677,14 +1920,14 @@ export function fromBinding<_embedded = _.GenericEmbedded>(_v: Binding<_embedded return _.Record($named, [_v["name"], fromSimplePattern<_embedded>(_v["pattern"])]); } -export function asRef<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): (Ref & {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>}) { +export function asRef<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): Ref { let result = toRef(v); if (result === void 0) throw new TypeError(`Invalid Ref: ${_.stringify(v)}`); return result; } -export function toRef<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | (Ref & {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>}) { - let result: undefined | (Ref & {__as_preserve__<_embedded = _.GenericEmbedded>(): _.Value<_embedded>}); +export function toRef<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): undefined | Ref { + let result: undefined | Ref; if (_.Record.isRecord<_.Value<_embedded>, _.Tuple<_.Value<_embedded>>, _embedded>(v)) { let _tmp0: ({}) | undefined; _tmp0 = _.is(v.label, $ref) ? {} : void 0; @@ -1695,7 +1938,13 @@ export function toRef<_embedded = _.GenericEmbedded>(v: _.Value<_embedded>): und let _tmp2: (symbol) | undefined; _tmp2 = typeof v[1] === 'symbol' ? v[1] : void 0; if (_tmp2 !== void 0) { - result = {"module": _tmp1, "name": _tmp2, __as_preserve__() {return fromRef(this);}}; + result = { + "module": _tmp1, + "name": _tmp2, + __as_preserve__() {return fromRef(this);}, + __preserve_on__(e) { e.push(fromRef(this)); }, + __preserve_text_on__(w) { w.push(fromRef(this)); } + }; }; }; }; diff --git a/implementations/javascript/packages/schema/src/reader.ts b/implementations/javascript/packages/schema/src/reader.ts index ae66eb2..b25c6c0 100644 --- a/implementations/javascript/packages/schema/src/reader.ts +++ b/implementations/javascript/packages/schema/src/reader.ts @@ -1,4 +1,4 @@ -import { Reader, Annotated, Dictionary, is, peel, preserves, Record, strip, Tuple, Position, position, stringify, isCompound, KeyedDictionary, annotate, annotations, isEmbedded, GenericEmbedded, genericEmbeddedTypeDecode } from '@preserves/core'; +import { Reader, Annotated, Dictionary, is, peel, preserves, Record, strip, Tuple, Position, position, stringify, isCompound, EncodableDictionary, annotate, annotations, isEmbedded, GenericEmbedded, genericEmbeddedTypeDecode } from '@preserves/core'; import { Input, Pattern, Schema, Definition, CompoundPattern, SimplePattern } from './meta'; import * as M from './meta'; import { SchemaSyntaxError } from './error'; @@ -70,7 +70,7 @@ export function parseSchema(toplevelTokens: Array, options: SchemaReaderO { let version: M.Version | undefined = void 0; let embeddedType: M.EmbeddedTypeName = M.EmbeddedTypeName.$false(); - let definitions = new KeyedDictionary(); + let definitions: M.Definitions = new EncodableDictionary(k => k, M.fromDefinition); function process(toplevelTokens: Array): void { const toplevelClauses = splitBy(peel(toplevelTokens) as Array, M.DOT); diff --git a/implementations/javascript/packages/schema/test/reader.test.ts b/implementations/javascript/packages/schema/test/reader.test.ts index adb13da..7b58ba0 100644 --- a/implementations/javascript/packages/schema/test/reader.test.ts +++ b/implementations/javascript/packages/schema/test/reader.test.ts @@ -9,7 +9,11 @@ describe('reader schema', () => { }); it('is OK with an empty schema correctly versioned', () => { const s = readSchema('version 1 .'); - expect(Object.getOwnPropertyNames(s.version)).toEqual(['__as_preserve__']); + expect(Object.getOwnPropertyNames(s.version)).toEqual([ + '__as_preserve__', + '__preserve_on__', + '__preserve_text_on__', + ]); expect(s.definitions.size).toBe(0); expect(s.embeddedType._variant).toBe('false'); });