"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Visitor = exports.GenericSeed = void 0;
const utils_1 = require("../utils");
const interface_1 = require("./interface");
class GenericSeed {
    constructor(visitor = new Visitor()) {
        Object.defineProperty(this, "visitor", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: void 0
        });
        this.visitor = visitor;
    }
    static deserialize(deserializer, visitor = new Visitor()) {
        return deserializer.deserializeAny(visitor);
    }
    deserialize(deserializer) {
        return GenericSeed.deserialize(deserializer, this.visitor);
    }
}
exports.GenericSeed = GenericSeed;
class Visitor {
    constructor(overrides) {
        Object.defineProperty(this, "overrides", {
            enumerable: true,
            configurable: true,
            writable: true,
            value: void 0
        });
        this.overrides = overrides;
    }
    static from(visitor) {
        if (visitor instanceof Visitor || (0, interface_1.isVisitor)(visitor)) {
            return visitor;
        }
        return new this(visitor);
    }
    visitBoolean(value) {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitBoolean) === null || _b === void 0 ? void 0 : _b.call(_a, value)) !== null && _c !== void 0 ? _c : value;
    }
    visitNumber(value) {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitNumber) === null || _b === void 0 ? void 0 : _b.call(_a, value)) !== null && _c !== void 0 ? _c : value;
    }
    visitBigInt(value) {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitBigInt) === null || _b === void 0 ? void 0 : _b.call(_a, value)) !== null && _c !== void 0 ? _c : value;
    }
    visitString(value) {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitString) === null || _b === void 0 ? void 0 : _b.call(_a, value)) !== null && _c !== void 0 ? _c : value;
    }
    visitSymbol(value) {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitSymbol) === null || _b === void 0 ? void 0 : _b.call(_a, value)) !== null && _c !== void 0 ? _c : value;
    }
    visitNull() {
        var _a, _b, _c;
        return (_c = (_b = (_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitNull) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : null;
    }
    visitObject(access) {
        var _a, _b;
        if ((0, utils_1.isFunction)((_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitObject)) {
            return (_b = this.overrides) === null || _b === void 0 ? void 0 : _b.visitObject(access);
        }
        const result = [];
        for (const entry of access) {
            result.push(entry);
        }
        return Object.fromEntries(result);
    }
    visitIterable(access) {
        var _a, _b;
        if ((0, utils_1.isFunction)((_a = this.overrides) === null || _a === void 0 ? void 0 : _a.visitIterable)) {
            return (_b = this.overrides) === null || _b === void 0 ? void 0 : _b.visitIterable(access);
        }
        const result = [];
        for (const element of access) {
            result.push(element);
        }
        return result;
    }
}
exports.Visitor = Visitor;