UNPKG

fuzzy-rater

Version:

Tooling for fuzzily rating text according to some query

96 lines 7.51 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DFA = exports.remainingCode = void 0; exports.remainingCode = "re"; /** * A class to represent deterministic finite automata and their operations */ class DFA { /** * Creates a new DFA according to the given template * @param template The template of the DFA */ constructor(template) { this.initialize(template); } /** * Retrieves the character code of a given transition * @param transition The transition to get a code for the transition character for * @returns The character code */ getCharacterCode(transition) { return transition.type == "character" && transition.character ? transition.character : exports.remainingCode; } /** * Initializes the DFA structure * @param template The DFA template */ initialize(template) { // Map each node to an index, since node IDs can be very long and therefore inefficient const nodeMap = new Map(template.nodes.map((node, i) => [node.ID, i])); const initial = nodeMap.get(template.initial); if (initial === undefined) throw Error("Initial state can't be found"); this.initial = initial; this.nodes = template.nodes; this.transitions = template.nodes.map((node, i) => Object.fromEntries(node.transitions.map(trans => [ this.getCharacterCode(trans), nodeMap.get(trans.to), ]))); // Extra data to perform a faster traced search this.traceTransitions = template.nodes.map((node, i) => Object.fromEntries(node.transitions.map(trans => [ this.getCharacterCode(trans), { state: nodeMap.get(trans.to), metadata: trans.metadata }, ]))); } /** * Executes the DFA on the given input, and returns the metadata of the final node, if any * @param input The input to execute the DFA on * @returns The metadata */ execute(input) { let state = this.initial; // Step through all characters for (let i = 0; i < input.length; i++) { const char = input[i]; if (state == undefined) return; const transitions = this.transitions[state]; state = transitions[char] || transitions[exports.remainingCode]; } // Return the result if (state == undefined) return; const node = this.nodes[state]; return node === null || node === void 0 ? void 0 : node.metadata; } /** * Executes the DFA on the given input, and returns the metadata of the trace * @param input The input to execute the DFA on * @returns The metadata */ executeTraced(input) { let state = this.initial; const path = []; // Step through all characters for (let i = 0; i < input.length; i++) { const char = input[i]; const transitions = this.traceTransitions[state]; const data = transitions[char] || transitions[exports.remainingCode]; const md = this.nodes[state].metadata; if (data) { path.push({ fromNode: md, transition: data.metadata }); state = data.state; } else return { finished: false, final: md, path }; } // Return the result const node = this.nodes[state]; return { finished: true, final: node.metadata, path }; } } exports.DFA = DFA; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiREZBLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0RGQS9ERkEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT2EsUUFBQSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBRWxDOztHQUVHO0FBQ0gsTUFBYSxHQUFHO0lBT1o7OztPQUdHO0lBQ0gsWUFBbUIsUUFBc0M7UUFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGdCQUFnQixDQUFDLFVBQXVDO1FBQzlELE9BQU8sVUFBVSxDQUFDLElBQUksSUFBSSxXQUFXLElBQUksVUFBVSxDQUFDLFNBQVM7WUFDekQsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTO1lBQ3RCLENBQUMsQ0FBQyxxQkFBYSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDTyxVQUFVLENBQUMsUUFBc0M7UUFDdkQsdUZBQXVGO1FBQ3ZGLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV2RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxJQUFJLE9BQU8sS0FBSyxTQUFTO1lBQUUsTUFBTSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFFNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxD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