fuzzy-rater
Version:
Tooling for fuzzily rating text according to some query
96 lines • 7.51 kB
JavaScript
;
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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