Allow folding with tables. (#2538)

This commit is contained in:
Andrés N. Robalino 2020-09-12 01:40:52 -05:00 committed by GitHub
parent dcfa135ab9
commit 7528094e12
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 60 additions and 15 deletions

View File

@ -50,9 +50,16 @@ async fn is_empty(
args: CommandArgs, args: CommandArgs,
registry: &CommandRegistry, registry: &CommandRegistry,
) -> Result<OutputStream, ShellError> { ) -> Result<OutputStream, ShellError> {
let name_tag = args.call_info.name_tag.clone();
let registry = registry.clone(); let registry = registry.clone();
let (IsEmptyArgs { rest }, input) = args.process(&registry).await?; let (IsEmptyArgs { rest }, input) = args.process(&registry).await?;
if input.is_empty() {
return Ok(OutputStream::one(ReturnSuccess::value(
UntaggedValue::boolean(true).into_value(name_tag),
)));
}
Ok(input Ok(input
.map(move |value| { .map(move |value| {
let value_tag = value.tag(); let value_tag = value.tag();
@ -72,7 +79,6 @@ async fn is_empty(
(_, _) => IsEmptyFor::Value, (_, _) => IsEmptyFor::Value,
} }
} else { } else {
// let no_args = vec![];
let mut arguments = rest.iter().rev(); let mut arguments = rest.iter().rev();
let replacement_if_true = match arguments.next() { let replacement_if_true = match arguments.next() {
Some(arg) => arg.clone(), Some(arg) => arg.clone(),

View File

@ -138,7 +138,19 @@ async fn reduce(
let row = each::make_indexed_item(input.0 + ioffset, input.1); let row = each::make_indexed_item(input.0 + ioffset, input.1);
async { async {
let f = acc?.into_vec().await[0].clone(); let values = acc?.drain_vec().await;
let f = if values.len() == 1 {
let value = values
.get(0)
.ok_or_else(|| ShellError::unexpected("No value to update with"))?;
value.clone()
} else if values.is_empty() {
UntaggedValue::nothing().into_untagged_value()
} else {
UntaggedValue::table(&values).into_untagged_value()
};
scope.vars.insert(String::from("$acc"), f); scope.vars.insert(String::from("$acc"), f);
process_row(block, Arc::new(scope), context, row).await process_row(block, Arc::new(scope), context, row).await
} }
@ -154,9 +166,20 @@ async fn reduce(
let context = Arc::clone(&context); let context = Arc::clone(&context);
async { async {
scope let values = acc?.drain_vec().await;
.vars
.insert(String::from("$acc"), acc?.into_vec().await[0].clone()); let f = if values.len() == 1 {
let value = values
.get(0)
.ok_or_else(|| ShellError::unexpected("No value to update with"))?;
value.clone()
} else if values.is_empty() {
UntaggedValue::nothing().into_untagged_value()
} else {
UntaggedValue::table(&values).into_untagged_value()
};
scope.vars.insert(String::from("$acc"), f);
process_row(block, Arc::new(scope), context, row).await process_row(block, Arc::new(scope), context, row).await
} }
}) })

View File

@ -40,8 +40,7 @@ fn adds_value_provided_for_columns_that_are_empty() {
[ [
{"boost": 1, "check": []}, {"boost": 1, "check": []},
{"boost": 1, "check": ""}, {"boost": 1, "check": ""},
{"boost": 1, "check": {}}, {"boost": 1, "check": {}}
{"boost": null, "check": ["" {} [] ""]}
] ]
"#, "#,
@ -58,7 +57,7 @@ fn adds_value_provided_for_columns_that_are_empty() {
"# "#
)); ));
assert_eq!(actual.out, "8"); assert_eq!(actual.out, "6");
}) })
} }
@ -72,8 +71,7 @@ fn value_emptiness_check() {
"are_empty": [ "are_empty": [
{"check": []}, {"check": []},
{"check": ""}, {"check": ""},
{"check": {}}, {"check": {}}
{"check": ["" {} [] ""]}
] ]
} }
"#, "#,
@ -91,6 +89,6 @@ fn value_emptiness_check() {
"# "#
)); ));
assert_eq!(actual.out, "4"); assert_eq!(actual.out, "3");
}) })
} }

View File

@ -62,6 +62,26 @@ fn reduce_numbered_example() {
assert_eq!(actual.out, "1"); assert_eq!(actual.out, "1");
} }
#[test]
fn folding_with_tables() {
let actual = nu!(
cwd: ".", pipeline(
r#"
echo [10 20 30 40]
| reduce -f [] {
with-env [value $it] {
echo $acc | append $(= 10 * $(= $nu.env.value | str to-int))
}
}
| math sum
| echo $it
"#
)
);
assert_eq!(actual.out, "1000");
}
#[test] #[test]
fn error_reduce_fold_type_mismatch() { fn error_reduce_fold_type_mismatch() {
let actual = nu!( let actual = nu!(

View File

@ -385,12 +385,10 @@ impl Value {
value: UntaggedValue::Primitive(p), value: UntaggedValue::Primitive(p),
.. ..
} => p.is_empty(), } => p.is_empty(),
t
@
Value { Value {
value: UntaggedValue::Table(_), value: UntaggedValue::Table(rows),
.. ..
} => t.table_entries().all(|row| row.is_empty()), } => rows.is_empty(),
r r
@ @
Value { Value {