| 1128 | } |
| 1129 | |
| 1130 | fn balanced_tree(&mut self, lo: usize, hi: usize) -> IdedExpr { |
| 1131 | let mid = (lo + hi).div_ceil(2); |
| 1132 | |
| 1133 | let left = if mid == lo { |
| 1134 | mem::take(&mut self.terms[mid]) |
| 1135 | } else { |
| 1136 | self.balanced_tree(lo, mid - 1) |
| 1137 | }; |
| 1138 | |
| 1139 | let right = if mid == hi { |
| 1140 | mem::take(&mut self.terms[mid + 1]) |
| 1141 | } else { |
| 1142 | self.balanced_tree(mid + 1, hi) |
| 1143 | }; |
| 1144 | |
| 1145 | IdedExpr { |
| 1146 | id: self.ops[mid], |
| 1147 | expr: Expr::Call(CallExpr { |
| 1148 | target: None, |
| 1149 | func_name: self.function.clone(), |
| 1150 | args: vec![left, right], |
| 1151 | }), |
| 1152 | } |
| 1153 | } |
| 1154 | } |
| 1155 | |
| 1156 | #[cfg(test)] |