unitof's notebooks

  • S160 Logic Playground - /unitof/s160-logic-playground
    Last edited 5 years ago - from: https://npm.runkit.com/boolean-parser
    const booleans = require('boolean-parser') const MathParser = require("expr-eval").Parser const s160Parser = new MathParser({ add: true, concatenate: true, conditional: true, divide: true, factorial: true, multiply: true, power: true, remainder: true, subtract: true, logical: false, // handled by boolean-parser comparison: true }) const strToNum = require('parse-decimal-number') console.log(s160Parser.evaluate('false')) const variables = { // Structured purely for demo purposes questions: { q1: { text: 'Birth year?', answers: { '-1': 'refused', '0': 'under 18', '1': '18+' }, answer: 1 } }, data: { gender: 'male', children: 4 } } // READ HANDWRITTEN LOGIC FROM SCRIPT const query = '{children} > 0 AND ([q1] == 1 OR [q1] == -1)' // has children according to data on file, and indicated is over 18 or refused to give age // PARSE VARIABLES const parsedQuery = query.replace(/\{([^\{\}]+)\}/g, replaceDataVariable) // matches {...} .replace(/\[([^\[\]]+)\]/g, replaceAnswerVariable) // matches [...] function replaceDataVariable(match, key) { // key = text between {curly braces} (first regex paren match) return variables.data[key] } function replaceAnswerVariable(match, questionID) { // questionID = text between [square braces] (first regex paren match) return variables.questions[questionID].answer } // RUN COMPARISONS const possiblePositives = booleans.parseBooleanQuery(parsedQuery) possiblePositives.forEach(comparisons => { const boolArray = comparisons.map(comparison => s160Parser.evaluate(comparison)) console.log(boolArray) if (boolArray.every(bool => bool)) { console.log('Pass! (Overrides any Fails)') } else { console.log('Fail.') } // TODO use loop not forEach; I gotta break out upon first Pass })