Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 134x 134x 134x 1x 1x 133x 133x 133x 141x 141x 141x 12x 141x 68x 141x 60x 141x 1x 141x 133x 133x 133x 133x 133x 1x 1x 1x | import {
FormulaBuilderBlockType,
type AmaliaFormula,
type FormulaBuilder,
type FormulaBuilderFormulaBlock,
type FormulaBuilderLogicalOperatorBlock,
} from '@amalia/amalia-lang/formula/types';
import { formulaBuilderFunctionToAmaliaFunction } from './formulaBuilderFunctionBlockToAmaliaFormula';
/** Simply return the raw formula from a formula block */
const getFormulaFromFormulaBlock = (formulaBlock: FormulaBuilderFormulaBlock): AmaliaFormula => formulaBlock.formula;
/** Recursive function to parse and transform all nodes into pieces of AmaliaFormula */
const formulaBuilderToAmaliaFormulaRec = (block: FormulaBuilderLogicalOperatorBlock): AmaliaFormula => {
const { logicalOperator, operands } = block;
if (!operands.length) {
throw new Error('Cannot parse empty operands');
}
return operands
.map((operand) => {
const { type } = operand;
switch (type) {
case FormulaBuilderBlockType.FORMULA:
return getFormulaFromFormulaBlock(operand);
case FormulaBuilderBlockType.LOGICAL_OPERATOR:
return formulaBuilderToAmaliaFormulaRec(operand);
case FormulaBuilderBlockType.FUNCTION:
return formulaBuilderFunctionToAmaliaFunction(operand);
default:
throw new Error(`Unhandled block type: ${type}`);
}
})
.filter((node) => node.length)
.map((node) => `(${node})`)
.join(` ${logicalOperator} `);
};
export const formulaBuilderToAmaliaFormula = (formulaBuilder: FormulaBuilder): AmaliaFormula =>
formulaBuilderToAmaliaFormulaRec(formulaBuilder.root);
|