diff --git a/crates/nu-command/src/commands/reduce.rs b/crates/nu-command/src/commands/reduce.rs index 9cf9177a44..dee39bda61 100644 --- a/crates/nu-command/src/commands/reduce.rs +++ b/crates/nu-command/src/commands/reduce.rs @@ -155,7 +155,17 @@ fn reduce(raw_args: CommandArgs) -> Result { let result = process_row(block, &*context, row); context.scope.exit_scope(); - result + // we make sure that result is an indexed item + result.and_then(|mut acc| { + let values = acc.drain_vec(); + let value = values + .get(0) + .ok_or_else(|| ShellError::unexpected("No value to update with"))?; + Ok(InputStream::one(match value.value { + UntaggedValue::Primitive(_) => each::make_indexed_item(0, value.clone()), + _ => value.clone(), + })) + }) })? .to_action_stream()) } else { diff --git a/crates/nu-command/tests/commands/reduce.rs b/crates/nu-command/tests/commands/reduce.rs index 108118767d..6d1f134df7 100644 --- a/crates/nu-command/tests/commands/reduce.rs +++ b/crates/nu-command/tests/commands/reduce.rs @@ -61,6 +61,21 @@ fn reduce_numbered_example() { assert_eq!(actual.out, "1"); } +#[test] +fn reduce_numbered_integer_addition_example() { + let actual = nu!( + cwd: ".", pipeline( + r#" + echo [1 2 3 4] + | reduce -n {= $acc.item + $it.item } + | get item + "# + ) + ); + + assert_eq!(actual.out, "10"); +} + #[test] fn folding_with_tables() { let actual = nu!(