core/factories/reason.factory.ts

core/factories/reason.factory.ts is a file in GovLab Context. 69 lines of code and 10 definitions.

import type { ReasonData, ReasonIndexes, ReasonOntology, ReasonOntologyOptions } from "#types/reason.types";
import { buildIndexes, conceptResolver, resolveId } from "#core/resolvers/reason.resolver";
import { collectIds, kindMembersOf, uncoveredCellsOf } from "#core/selectors/reason.selector";
import { COLLECTIONS } from "#configuration/constants/ontology.constants";
import { CheckTable } from "#core/stores/check.store";
import { LOADED } from "#configuration/strings/reason.strings";
import { NOOP_LOGGER } from "#core/reporters/ontology.reporter";
import { ReadAudit } from "#core/observers/record.observer";
import { deepFreeze } from "#core/converters/base.converter";
import { defineOntologyFace } from "#core/registries/ontology.registry";
import { loadBundledData } from "#core/loaders/reason.loader";
import { validateReason } from "#core/validators/reason.validator";

type ReasonPort = Omit<ReasonOntology, "checkOf" | "unreadKeys">;

const reasonPort = function reasonPort(data: ReasonData, indexes: ReasonIndexes): ReasonPort {
    const resolveConcept = conceptResolver(indexes.concepts);
    return {
        axes: () => [...data.axes],
        axis: (id) => indexes.axis.get(id) ?? null,
        conceptOf: (nodeId) => {
            const node = indexes.node.get(nodeId);
            return node ? resolveConcept(node) : null;
        },
        derivationLoop: () => data.derivationLoop,
        dimensions: () => [...data.dimensions],
        edges: () => [...data.edges],
        failureShapes: () => [...data.failureShapes],
        ids: () => collectIds(data),
        invariants: () => [...data.invariants],
        kindMembers: () => kindMembersOf(data),
        layers: () => [...data.layers],
        lenses: () => [...data.lenses],
        maps: () => data.maps,
        mathDomains: () => [...data.mathDomains],
        mathType: (id) => indexes.mathType.get(id) ?? null,
        mathTypes: () => [...data.mathTypes],
        models: () => [...data.models],
        modes: () => [...data.modes],
        node: (id) => indexes.node.get(id) ?? null,
        nodes: (axis) =>
            typeof axis === "string" && axis.length > 0
                ? data.nodes.filter((node) => node.axis === axis)
                : [...data.nodes],
        patternTypes: () => [...data.patternTypes],
        representations: () => [...data.representations],
        resolve: resolveId(data, indexes),
        substrate: () => data.substrate,
        techniques: () => [...data.techniques],
        testSurfaces: () => [...data.testSurfaces],
        uncoveredCells: () => uncoveredCellsOf(data),
        universalAxes: () => [...data.universalAxes],
        validateReasonOntology: () => validateReason(data),
    };
};

export const createReason = function createReason(options: ReasonOntologyOptions = {}): ReasonOntology {
    const logger = options.logger ?? NOOP_LOGGER;
    const audit = new ReadAudit(COLLECTIONS.reasoning);
    const checks = new CheckTable();
    const data = deepFreeze(options.data ?? loadBundledData(audit, checks));
    logger.warn(LOADED, { nodes: data.nodes.length });
    return {
        ...reasonPort(data, buildIndexes(data)),
        checkOf: (kind, id) => checks.checkOf(kind, id),
        unreadKeys: () => audit.unread(),
    };
};

export const REASON_FACE = defineOntologyFace<ReasonOntology>({
    build: (context) => createReason({ logger: context.logger }),
    name: COLLECTIONS.reasoning,
});