@@ -6,7 +6,7 @@ use std::{convert::identity, iter::repeat};
6
6
use ecow:: { eco_vec, EcoVec } ;
7
7
8
8
use crate :: {
9
- algorithm:: { get_ops, loops:: flip, multi_output , pervade:: * } ,
9
+ algorithm:: { get_ops, loops:: flip, pervade:: * } ,
10
10
check:: { nodes_clean_sig, nodes_sig} ,
11
11
cowslice:: cowslice,
12
12
Array , ArrayValue , Complex , ImplPrimitive , Node , Ops , Primitive , Shape , SigNode , Uiua ,
@@ -1049,7 +1049,7 @@ pub fn fold(ops: Ops, env: &mut Uiua) -> UiuaResult {
1049
1049
crate :: profile_function!( ) ;
1050
1050
let [ f] = get_ops ( ops, env) ?;
1051
1051
let sig = f. sig ;
1052
- let ( iterable_count, acc_count, collect_count ) = if sig. args ( ) > sig. outputs ( ) {
1052
+ let ( iterable_count, acc_count, excess_count ) = if sig. args ( ) > sig. outputs ( ) {
1053
1053
( sig. args ( ) - sig. outputs ( ) , sig. outputs ( ) , 0 )
1054
1054
} else {
1055
1055
let iter = sig. args ( ) . min ( 1 ) ;
@@ -1095,7 +1095,7 @@ pub fn fold(ops: Ops, env: &mut Uiua) -> UiuaResult {
1095
1095
if row_count == 0 && arrays. iter ( ) . all ( Result :: is_err) {
1096
1096
row_count = 1 ;
1097
1097
}
1098
- let mut collect = multi_output ( collect_count , Vec :: with_capacity ( row_count ) ) ;
1098
+ let mut excess_rows = vec ! [ Vec :: new ( ) ; excess_count ] ;
1099
1099
for _ in 0 ..row_count {
1100
1100
for array in arrays. iter_mut ( ) . rev ( ) {
1101
1101
env. push ( match array {
@@ -1104,17 +1104,23 @@ pub fn fold(ops: Ops, env: &mut Uiua) -> UiuaResult {
1104
1104
} ) ;
1105
1105
}
1106
1106
env. exec ( f. clone ( ) ) ?;
1107
- for collected in & mut collect {
1108
- collected. push ( env. remove_nth_back ( acc_count) ?) ;
1107
+ if excess_count > 0 {
1108
+ for ( i, row) in env
1109
+ . remove_n ( excess_count, acc_count + excess_count) ?
1110
+ . enumerate ( )
1111
+ {
1112
+ excess_rows[ i] . push ( row) ;
1113
+ }
1109
1114
}
1110
1115
}
1111
- let accs = env. pop_n ( acc_count) ?;
1112
- for collected in collect. into_iter ( ) . rev ( ) {
1113
- let val = Value :: from_row_values ( collected, env) ?;
1114
- env. push ( val) ;
1116
+ // Remove preserved/excess values
1117
+ if excess_count > 0 {
1118
+ _ = env. remove_n ( acc_count, acc_count) ?;
1115
1119
}
1116
- for acc in accs {
1117
- env. push ( acc) ;
1120
+ // Collect excess values
1121
+ for rows in excess_rows. into_iter ( ) . rev ( ) {
1122
+ let new_val = Value :: from_row_values ( rows, env) ?;
1123
+ env. push ( new_val) ;
1118
1124
}
1119
1125
Ok ( ( ) )
1120
1126
}
0 commit comments