summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Wilson <jo.alex.w@gmail.com>2023-10-27 23:58:55 +1300
committerGitHub <noreply@github.com>2023-10-27 12:58:55 +0200
commite18277713336b6f53554bb76d6690043ce28faef (patch)
tree745673b3051b88c95543563589b4e1f37d753b96
parent1603e2df268dbcf4bddd2a019ddc39bce3454883 (diff)
Implement unary `array.zip`, closing #2478 (#2491)
-rw-r--r--crates/typst/src/eval/array.rs13
-rw-r--r--tests/typ/compiler/array.typ3
2 files changed, 14 insertions, 2 deletions
diff --git a/crates/typst/src/eval/array.rs b/crates/typst/src/eval/array.rs
index bee3fae7..f139907f 100644
--- a/crates/typst/src/eval/array.rs
+++ b/crates/typst/src/eval/array.rs
@@ -473,9 +473,18 @@ impl Array {
#[variadic]
others: Vec<Array>,
) -> SourceResult<Array> {
- // Fast path for just two arrays.
let mut args = args;
- if args.remaining() <= 1 {
+
+ // Fast path for one array.
+ if args.remaining() == 0 {
+ return Ok(self
+ .iter()
+ .map(|item| array![item.clone()].into_value())
+ .collect());
+ }
+
+ // Fast path for just two arrays.
+ if args.remaining() == 1 {
let other = args.expect::<Array>("others")?;
args.finish()?;
return Ok(self
diff --git a/tests/typ/compiler/array.typ b/tests/typ/compiler/array.typ
index 12c3c3a0..4191d6ff 100644
--- a/tests/typ/compiler/array.typ
+++ b/tests/typ/compiler/array.typ
@@ -260,6 +260,9 @@
#test((1, 2, 3).zip((3, 4, 5), (6, 7, 8)), ((1, 3, 6), (2, 4, 7), (3, 5, 8)))
#test(().zip((), ()), ())
#test((1,).zip((2,), (3,)), ((1, 2, 3),))
+#test((1, 2, 3).zip(), ((1,), (2,), (3,)))
+#test(array.zip(()), ())
+#test(array.zip(("a", "b")), (("a",), ("b",)))
---
// Test the `enumerate` method.