aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter <peterhsaxton@gmail.com>2020-08-14 08:50:36 +0100
committerLouis Pilfold <louis@lpil.uk>2020-08-14 11:27:21 +0100
commitfdf7145a92a4be1e9780372b8de5c4770ee06d33 (patch)
tree65799695c2489de3d4a7394111fca84687491764
parent36232a3920aa4aaca667d66dfbedfb2d4227a114 (diff)
downloadgleam_stdlib-fdf7145a92a4be1e9780372b8de5c4770ee06d33.tar.gz
gleam_stdlib-fdf7145a92a4be1e9780372b8de5c4770ee06d33.zip
test and implement unzip
-rw-r--r--src/gleam/list.gleam11
-rw-r--r--test/gleam/list_test.gleam8
2 files changed, 19 insertions, 0 deletions
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index 06e5a33..c82db2e 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -623,6 +623,17 @@ pub fn strict_zip(
}
}
+fn do_unzip(input, xs, ys) {
+ case input {
+ [] -> tuple(reverse(xs), reverse(ys))
+ [tuple(x, y), ..rest] -> do_unzip(rest, [x, ..xs], [y, ..ys])
+ }
+}
+
+pub fn unzip(input: List(tuple(a, b))) -> tuple(List(a), List(b)) {
+ do_unzip(input, [], [])
+}
+
/// Insert a given value between each existing element in a given list.
///
/// This function runs in linear time and copies the list.
diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam
index 31f8f27..eff9fac 100644
--- a/test/gleam/list_test.gleam
+++ b/test/gleam/list_test.gleam
@@ -264,6 +264,14 @@ pub fn strict_zip_test() {
|> should.equal(Error(list.LengthMismatch))
}
+pub fn unzip_test() {
+ list.unzip([tuple(1, 2), tuple(3, 4)])
+ |> should.equal(tuple([1, 3], [2, 4]))
+
+ list.unzip([])
+ |> should.equal(tuple([], []))
+}
+
pub fn intersperse_test() {
list.intersperse([1, 2, 3], 4)
|> should.equal([1, 4, 2, 4, 3])