233 lines
6.3 KiB
JavaScript
233 lines
6.3 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.Forward = exports.ForwardIterableAccess = exports.ForwardMapAccess = exports.GenericVisitor = exports.GenericSeed = exports.IterableAccess = exports.MapAccess = exports.IterResult = void 0;
|
|
exports.deserialize = deserialize;
|
|
const registry_1 = require("../registry");
|
|
class IterResult {
|
|
static Next(value) {
|
|
return { done: false, value };
|
|
}
|
|
static Done() {
|
|
return { done: true, value: undefined };
|
|
}
|
|
}
|
|
exports.IterResult = IterResult;
|
|
class MapAccess {
|
|
nextEntrySeed(kseed, vseed) {
|
|
const key = this.nextKeySeed(kseed);
|
|
if (!key.done) {
|
|
const value = this.nextValueSeed(vseed);
|
|
if (!value.done) {
|
|
return IterResult.Next([key.value, value.value]);
|
|
}
|
|
}
|
|
return IterResult.Done();
|
|
}
|
|
nextEntry() {
|
|
const key = this.nextKey();
|
|
if (!key.done) {
|
|
const value = this.nextValue();
|
|
if (!value.done) {
|
|
return IterResult.Next([key.value, value.value]);
|
|
}
|
|
}
|
|
return IterResult.Done();
|
|
}
|
|
}
|
|
exports.MapAccess = MapAccess;
|
|
class IterableAccess {
|
|
}
|
|
exports.IterableAccess = IterableAccess;
|
|
class GenericSeed {
|
|
constructor(visitor = new GenericVisitor()) {
|
|
Object.defineProperty(this, "visitor", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
this.visitor = visitor;
|
|
}
|
|
static deserialize(deserializer, visitor = new GenericVisitor()) {
|
|
return deserializer.deserializeAny(visitor);
|
|
}
|
|
deserialize(deserializer) {
|
|
return GenericSeed.deserialize(deserializer, this.visitor);
|
|
}
|
|
}
|
|
exports.GenericSeed = GenericSeed;
|
|
class GenericVisitor {
|
|
visitBoolean(value) {
|
|
return value;
|
|
}
|
|
visitNumber(value) {
|
|
return value;
|
|
}
|
|
visitBigInt(value) {
|
|
return value;
|
|
}
|
|
visitString(value) {
|
|
return value;
|
|
}
|
|
visitSymbol(value) {
|
|
return value;
|
|
}
|
|
visitNull() {
|
|
return null;
|
|
}
|
|
visitObject(access) {
|
|
const result = [];
|
|
let entry;
|
|
while ((entry = access.nextEntry()) && !entry.done) {
|
|
result.push(entry.value);
|
|
}
|
|
return Object.fromEntries(result);
|
|
}
|
|
visitIterable(access) {
|
|
const result = [];
|
|
let element;
|
|
while ((element = access.nextElement())) {
|
|
result.push(element);
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
exports.GenericVisitor = GenericVisitor;
|
|
class ForwardMapAccess extends MapAccess {
|
|
constructor(keys, values) {
|
|
super();
|
|
Object.defineProperty(this, "keys", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "values", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "kindex", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: 0
|
|
});
|
|
Object.defineProperty(this, "vindex", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: 0
|
|
});
|
|
this.keys = keys;
|
|
this.values = values;
|
|
}
|
|
static fromObject(obj) {
|
|
return new ForwardMapAccess(Object.keys(obj), Object.values(obj));
|
|
}
|
|
nextKeySeed(_seed) {
|
|
return this.nextKey();
|
|
}
|
|
nextValueSeed(_seed) {
|
|
return this.nextValue();
|
|
}
|
|
nextKey() {
|
|
if (this.kindex < this.keys.length) {
|
|
return IterResult.Next(this.keys[this.kindex++]);
|
|
}
|
|
else {
|
|
return IterResult.Done();
|
|
}
|
|
}
|
|
nextValue() {
|
|
if (this.vindex < this.values.length) {
|
|
return IterResult.Next(this.values[this.vindex++]);
|
|
}
|
|
else {
|
|
return IterResult.Done();
|
|
}
|
|
}
|
|
}
|
|
exports.ForwardMapAccess = ForwardMapAccess;
|
|
class ForwardIterableAccess extends IterableAccess {
|
|
constructor(items) {
|
|
super();
|
|
Object.defineProperty(this, "items", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
Object.defineProperty(this, "index", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: 0
|
|
});
|
|
this.items = items;
|
|
}
|
|
nextElement() {
|
|
if (this.index < this.items.length) {
|
|
return IterResult.Next(this.items[this.index++]);
|
|
}
|
|
else {
|
|
return IterResult.Done();
|
|
}
|
|
}
|
|
}
|
|
exports.ForwardIterableAccess = ForwardIterableAccess;
|
|
class Forward {
|
|
constructor(value) {
|
|
Object.defineProperty(this, "value", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true,
|
|
value: void 0
|
|
});
|
|
this.value = value;
|
|
}
|
|
static with(value) {
|
|
return new this(value);
|
|
}
|
|
deserializeAny(_visitor) {
|
|
throw new Error("Can't forward to deserializeAny");
|
|
}
|
|
deserializeBoolean(visitor) {
|
|
return visitor.visitBoolean(this.value);
|
|
}
|
|
deserializeNumber(visitor) {
|
|
return visitor.visitNumber(this.value);
|
|
}
|
|
deserializeBigInt(visitor) {
|
|
return visitor.visitBigInt(this.value);
|
|
}
|
|
deserializeString(visitor) {
|
|
return visitor.visitString(this.value);
|
|
}
|
|
deserializeSymbol(visitor) {
|
|
return visitor.visitSymbol(this.value);
|
|
}
|
|
deserializeNull(visitor) {
|
|
return visitor.visitNull();
|
|
}
|
|
deserializeObject(visitor) {
|
|
return visitor.visitObject(ForwardMapAccess.fromObject(this.value));
|
|
}
|
|
deserializeIterable(visitor) {
|
|
return visitor.visitIterable(new ForwardIterableAccess(this.value));
|
|
}
|
|
deserializeFunction(_visitor) {
|
|
throw new Error('Method not implemented.');
|
|
}
|
|
}
|
|
exports.Forward = Forward;
|
|
function deserialize(deserializer, into, registry = registry_1.GlobalRegistry) {
|
|
const de = registry.deserializers.get(into);
|
|
if (de == null) {
|
|
throw new ReferenceError(`No deserializer for ${into.name}`);
|
|
}
|
|
else {
|
|
return de(deserializer);
|
|
}
|
|
}
|