* Get (binary) combinations of a flattened binary node * e.g. +(node1, node2, node3) -> [ * +(node1, +(node2, node3)), * +(node2, +(node1, node3)), * +(node3, +(node1, node2))] *
(node, context)
| 719 | * |
| 720 | */ |
| 721 | function getSplits (node, context) { |
| 722 | const res = [] |
| 723 | let right, rightArgs |
| 724 | const makeNode = createMakeNodeFunction(node) |
| 725 | if (isCommutative(node, context)) { |
| 726 | for (let i = 0; i < node.args.length; i++) { |
| 727 | rightArgs = node.args.slice(0) |
| 728 | rightArgs.splice(i, 1) |
| 729 | right = (rightArgs.length === 1) ? rightArgs[0] : makeNode(rightArgs) |
| 730 | res.push(makeNode([node.args[i], right])) |
| 731 | } |
| 732 | } else { |
| 733 | // Keep order, but try all parenthesizations |
| 734 | for (let i = 1; i < node.args.length; i++) { |
| 735 | let left = node.args[0] |
| 736 | if (i > 1) { |
| 737 | left = makeNode(node.args.slice(0, i)) |
| 738 | } |
| 739 | rightArgs = node.args.slice(i) |
| 740 | right = (rightArgs.length === 1) ? rightArgs[0] : makeNode(rightArgs) |
| 741 | res.push(makeNode([left, right])) |
| 742 | } |
| 743 | } |
| 744 | return res |
| 745 | } |
| 746 | |
| 747 | /** |
| 748 | * Returns the set union of two match-placeholders or null if there is a conflict. |
no test coverage detected
searching dependent graphs…