mathsteps-experimental-fork
Version:
Step by step math solutions. Experimental Fork
39 lines (36 loc) • 1.72 kB
JavaScript
import { isOperatorNode } from '../config.js';
import '../index.js';
import { myNodeToString } from '../newServices/nodeServices/myNodeToString.js';
import { parseText } from '../newServices/nodeServices/parseText.js';
import { kemuFlatten } from '../simplifyExpression/kemuSimplifyCommonServices.js';
import '../util/regex.js';
import '../node/Type.js';
function extractFractionSides(node) {
if (isOperatorNode(node) && node.op === "/" && node.args.length === 2) {
const [num, den] = node.args;
return { numerator: num, denominator: den };
}
return null;
}
const countDivisionFn = (strOrNode) => {
const stringVersion = typeof strOrNode === "string" ? strOrNode : myNodeToString(strOrNode);
return stringVersion.split("/").length - 1;
};
function getCrossMultiplication(_leftNode, _rightNode) {
if (countDivisionFn(_leftNode) !== 1 || countDivisionFn(_rightNode) !== 1)
return null;
const leftNode = typeof _leftNode === "string" ? kemuFlatten(parseText(_leftNode)) : _leftNode;
const rightNode = typeof _rightNode === "string" ? kemuFlatten(parseText(_rightNode)) : _rightNode;
const leftFrac = extractFractionSides(leftNode);
const rightFrac = extractFractionSides(rightNode);
if (!leftFrac || !rightFrac)
return null;
const leftNum = leftFrac.numerator;
const leftDenom = leftFrac.denominator;
const rightNum = rightFrac.numerator;
const rightDenom = rightFrac.denominator;
const crossLeft = kemuFlatten(parseText(`(${myNodeToString(leftNum)}) * (${myNodeToString(rightDenom)})`));
const crossRight = kemuFlatten(parseText(`(${myNodeToString(leftDenom)}) * (${myNodeToString(rightNum)})`));
return { crossLeft, crossRight };
}
export { getCrossMultiplication };