core/validators/algorithm.reference.validator.ts

core/validators/algorithm.reference.validator.ts is a file in GovLab Context. 49 lines of code and 7 definitions.

import type { AlgoContractView, GrammarGroundingFaces } from "#types/reference.types";
import {
    DOMAIN_CONCEPT_CATEGORIES,
    GATE_SUFFIX,
    REASON_PREFIX,
    REF_SEPARATOR,
} from "#configuration/constants/reference.constants";
import { bareReasonId, kindRefResolves, kindsHolding } from "#core/resolvers/reference.resolver";

export const ungroundedGatesOf = function ungroundedGatesOf(faces: {
    algo: { all: () => AlgoContractView[] };
}): string[] {
    return faces.algo
        .all()
        .filter(
            (contract) =>
                contract.id.endsWith(GATE_SUFFIX) &&
                !DOMAIN_CONCEPT_CATEGORIES.has(contract.domain) &&
                (contract.grounds ?? []).length === 0,
        )
        .map((contract) => contract.id)
        .toSorted((a, b) => a.localeCompare(b));
};

export const unresolvedGrammarGroundsOf = function unresolvedGrammarGroundsOf(
    faces: GrammarGroundingFaces,
): { from: string; target: string }[] {
    const kindMembers = faces.reason.kindMembers();
    return faces.algo.all().flatMap((contract) =>
        (contract.grounds ?? [])
            .filter((target) => {
                const id = bareReasonId(target);
                return id.includes(REF_SEPARATOR)
                    ? !kindRefResolves(kindMembers, `${REASON_PREFIX}${id}`)
                    : faces.reason.resolve(id) === null;
            })
            .map((target) => ({ from: contract.id, target })),
    );
};

export const ambiguousReasonRefsOf = function ambiguousReasonRefsOf(
    faces: GrammarGroundingFaces,
): { from: string; kinds: string[]; target: string }[] {
    const kindMembers = faces.reason.kindMembers();
    return faces.algo.all().flatMap((contract) =>
        (contract.grounds ?? []).flatMap((target) => {
            const bare = bareReasonId(target);
            const kinds = bare.includes(REF_SEPARATOR) ? [] : kindsHolding(kindMembers, bare);
            return kinds.length > 1 ? [{ from: contract.id, kinds, target }] : [];
        }),
    );
};