@@ -197,22 +197,55 @@ function reduceAddSubExpression(node, precision) {
197
197
// (expr) + (expr) => number
198
198
// (expr) - (expr) => number
199
199
if ( node . right . type === 'MathExpression' && node . left . type === 'MathExpression' ) {
200
- if ( isEqual ( node . left . right , node . right . right ) ) {
201
- const newNodes = covertNodesUnits ( node . left . left , node . right . left , precision ) ;
200
+ if (
201
+ ( node . left . operator === "-" && node . right . operator === "+" ) ||
202
+ ( node . right . operator === "-" && node . left . operator === "+" )
203
+ ) {
204
+ // (expr1 - something) + (expr2 + something) => expr1 + expr2
205
+ // (expr1 + something) + (expr2 - something) => expr1 + expr2
206
+ // (expr1 - something) - (expr2 + something) => expr1 + expr2
207
+ // (expr1 + something) - (expr2 - something) => expr1 + expr2
208
+ if ( isEqual ( node . left . right , node . right . right ) ) {
209
+ const newNodes = covertNodesUnits ( node . left . left , node . right . left , precision ) ;
202
210
203
- node . left = newNodes . left ;
204
- node . right = newNodes . right ;
211
+ node . left = newNodes . left ;
212
+ node . right = newNodes . right ;
205
213
206
- return reduce ( node ) ;
207
- }
214
+ return reduce ( node , precision ) ;
215
+ }
208
216
209
- if ( isEqual ( node . left . right , node . right . left ) ) {
210
- const newNodes = covertNodesUnits ( node . left . left , node . right . right , precision ) ;
217
+ // (expr1 - something) + (something + expr2) => expr1 + expr2
218
+ // (expr1 + something) + (something - expr2) => expr1 + expr2
219
+ // (expr1 - something) - (something + expr2) => expr1 + expr2
220
+ // (expr1 + something) - (something - expr2) => expr1 + expr2
221
+ if ( isEqual ( node . left . right , node . right . left ) ) {
222
+ const newNodes = covertNodesUnits ( node . left . left , node . right . right , precision ) ;
211
223
212
- node . left = newNodes . left ;
213
- node . right = newNodes . right ;
224
+ node . left = newNodes . left ;
225
+ node . right = newNodes . right ;
214
226
215
- return reduce ( node ) ;
227
+ return reduce ( node , precision ) ;
228
+ }
229
+ // (expr1 / something) + (expr2 / something) => (expr1 + expr2) / something
230
+ // (expr1 * something) + (expr2 * something) => (expr1 + expr2) * something
231
+ // (expr1 / something) - (expr2 / something) => (expr1 - expr2) / something
232
+ // (expr1 * something) - (expr2 * something) => (expr1 - expr2) * something
233
+ } else if (
234
+ ( node . left . operator === "/" || node . left . operator === "*" ) &&
235
+ ( node . left . operator === node . right . operator ) &&
236
+ isEqual ( node . left . right , node . right . right )
237
+ ) {
238
+ return reduce ( {
239
+ type : "MathExpression" ,
240
+ operator : node . left . operator ,
241
+ left : {
242
+ type : "MathExpression" ,
243
+ operator : node . operator ,
244
+ left : node . left . left ,
245
+ right : node . right . left
246
+ } ,
247
+ right : node . left . right
248
+ } , precision )
216
249
}
217
250
}
218
251
0 commit comments