mirror of
https://github.com/nushell/nushell.git
synced 2025-06-30 14:40:06 +02:00
Add input support to generate
(#14804)
- closes #8523 # Description This PR adds pipeline input support to `generate`. - Without input, `generate` keeps its current behavior. - With input, each invocation of the closure is provided an item from the input stream as pipeline input (`$in`). If/when the input stream runs out, `generate` also stops. Before this PR, there is no filter command that is both stateful _and_ streaming. This PR also refactors `std/iter scan` to use `generate`, making it streaming and more performant over larger inputs. # User-Facing Changes - `generate` now supports pipeline input, passing each element to the closure as `$in` until it runs out - `std/iter scan` is now streaming # Tests + Formatting Added tests to validate the new feature. - 🟢 toolkit fmt - 🟢 toolkit clippy - 🟢 toolkit test - 🟢 toolkit test stdlib # After Submitting N/A
This commit is contained in:
@ -148,3 +148,25 @@ fn generate_raise_error_on_no_default_parameter_closure_and_init_val() {
|
||||
));
|
||||
assert!(actual.err.contains("The initial value is missing"));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generate_allows_pipeline_input() {
|
||||
let actual = nu!(r#"[1 2 3] | generate {|e, x=null| {out: $e, next: null}} | to nuon"#);
|
||||
assert_eq!(actual.out, "[1, 2, 3]");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn generate_with_input_is_streaming() {
|
||||
let actual = nu!(pipeline(
|
||||
r#"
|
||||
1..10
|
||||
| each {|x| print -en $x; $x}
|
||||
| generate {|e, sum=0| let sum = $e + $sum; {out: $sum, next: $sum}}
|
||||
| first 5
|
||||
| to nuon
|
||||
"#
|
||||
));
|
||||
|
||||
assert_eq!(actual.out, "[1, 3, 6, 10, 15]");
|
||||
assert_eq!(actual.err, "12345");
|
||||
}
|
||||
|
Reference in New Issue
Block a user