core/resolvers/reason.resolver.ts
core/resolvers/reason.resolver.ts is a file in GovLab Context. 95 lines of code and 12 definitions.
import type { CollectionKind, ConceptIndexes, ReasonData, ReasonIndexes, ReasonResolution } from "#types/reason.types";
import { CONCEPT_COLLECTION_BY_AXIS } from "#configuration/constants/reason.constants";
import type { ReasonNode } from "#types/reason.node.types";
const indexById = function indexById<R extends { id: string }>(records: readonly R[]): Map<string, R> {
const map = new Map<string, R>();
for (const record of records) {
if (!map.has(record.id)) {
map.set(record.id, record);
}
}
return map;
};
export const buildIndexes = function buildIndexes(data: ReasonData): ReasonIndexes {
return {
axis: indexById(data.axes),
concepts: {
dimension: indexById(data.dimensions),
lens: indexById(data.lenses),
mode: indexById(data.modes),
representation: indexById(data.representations),
},
failureShape: indexById(data.failureShapes),
invariant: indexById(data.invariants),
layer: indexById(data.layers),
mathDomain: indexById(data.mathDomains),
mathType: indexById(data.mathTypes),
model: indexById(data.models),
node: indexById(data.nodes),
patternType: indexById(data.patternTypes),
substrateNode: indexById(data.substrate.nodes),
technique: indexById(data.techniques),
testSurface: indexById(data.testSurfaces),
universalAxis: indexById(data.universalAxes),
};
};
const conceptMap = function conceptMap(
concepts: ConceptIndexes,
kind: CollectionKind,
): ReadonlyMap<string, object> | null {
const byKind: Partial<Record<CollectionKind, ReadonlyMap<string, object>>> = {
dimension: concepts.dimension,
lens: concepts.lens,
mode: concepts.mode,
representation: concepts.representation,
};
return byKind[kind] ?? null;
};
export const conceptResolver = function conceptResolver(
concepts: ConceptIndexes,
): (node: ReasonNode) => ReasonResolution | null {
return (node) => {
if (typeof node.concept !== "string") {
return null;
}
const kind = CONCEPT_COLLECTION_BY_AXIS.get(node.axis);
const record = kind ? (conceptMap(concepts, kind)?.get(node.concept) ?? null) : null;
return record && kind ? { kind, record } : null;
};
};
const resolveOrder = function resolveOrder(
indexes: ReasonIndexes,
): readonly [CollectionKind, ReadonlyMap<string, object>][] {
return [
["node", indexes.node],
["axis", indexes.axis],
["layer", indexes.layer],
["math-type", indexes.mathType],
["substrate-node", indexes.substrateNode],
["dimension", indexes.concepts.dimension],
["lens", indexes.concepts.lens],
["mode", indexes.concepts.mode],
["representation", indexes.concepts.representation],
["math-domain", indexes.mathDomain],
["pattern-type", indexes.patternType],
["model", indexes.model],
["universal-axis", indexes.universalAxis],
["test-surface", indexes.testSurface],
["technique", indexes.technique],
["invariant", indexes.invariant],
["failure-shape", indexes.failureShape],
];
};
export const resolveId = function resolveId(
data: ReasonData,
indexes: ReasonIndexes,
): (id: string) => ReasonResolution | null {
const order = resolveOrder(indexes);
return (id) => {
if (id === data.derivationLoop.id) {
return { kind: "loop", record: data.derivationLoop };
}
const hit = order.find(([, map]) => map.has(id));
return hit === undefined ? null : { kind: hit[0], record: hit[1].get(id) };
};
};