aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gleam/iterator.gleam17
-rw-r--r--src/gleam/list.gleam17
-rw-r--r--test/gleam/iterator_test.gleam10
-rw-r--r--test/gleam/list_test.gleam8
4 files changed, 52 insertions, 0 deletions
diff --git a/src/gleam/iterator.gleam b/src/gleam/iterator.gleam
index fa49b87..499cd92 100644
--- a/src/gleam/iterator.gleam
+++ b/src/gleam/iterator.gleam
@@ -946,3 +946,20 @@ pub fn reduce(
|> Ok
}
}
+
+/// Returns the last element in the given iterator.
+///
+/// Returns `Error(Nil)` if the iterator is empty.
+///
+/// ## Examples
+///
+/// > from_list([]) |> last
+/// Error(Nil)
+///
+/// > range(1, 10) |> last
+/// Ok(9)
+///
+pub fn last(iterator: Iterator(element)) -> Result(element, Nil) {
+ iterator
+ |> reduce(fn(elem, _) { elem })
+}
diff --git a/src/gleam/list.gleam b/src/gleam/list.gleam
index 9f88063..f99b729 100644
--- a/src/gleam/list.gleam
+++ b/src/gleam/list.gleam
@@ -1431,3 +1431,20 @@ pub fn scan(
) -> List(b) {
do_scan(list, initial, [], fun)
}
+
+/// Returns the last element in the given list.
+///
+/// Returns `Error(Nil)` if the list is empty.
+///
+/// ## Examples
+///
+/// > last([])
+/// Error(Nil)
+///
+/// > last([1, 2, 3, 4, 5])
+/// Ok(5)
+///
+pub fn last(list: List(a)) -> Result(a, Nil) {
+ list
+ |> reduce(fn(elem, _) { elem })
+}
diff --git a/test/gleam/iterator_test.gleam b/test/gleam/iterator_test.gleam
index 492bb1e..84459a2 100644
--- a/test/gleam/iterator_test.gleam
+++ b/test/gleam/iterator_test.gleam
@@ -383,3 +383,13 @@ pub fn reduce_test() {
|> iterator.reduce(with: fn(x, y) { x + y })
|> should.equal(Ok(15))
}
+
+pub fn last_test() {
+ iterator.from_list([])
+ |> iterator.last
+ |> should.equal(Error(Nil))
+
+ iterator.range(1, 10)
+ |> iterator.last
+ |> should.equal(Ok(9))
+}
diff --git a/test/gleam/list_test.gleam b/test/gleam/list_test.gleam
index 572812c..5fe2dd5 100644
--- a/test/gleam/list_test.gleam
+++ b/test/gleam/list_test.gleam
@@ -645,3 +645,11 @@ pub fn scan_test() {
)
|> should.equal(["Odd", "OddEven", "OddEvenOdd", "OddEvenOddEven"])
}
+
+pub fn last_test() {
+ list.last([])
+ |> should.equal(Error(Nil))
+
+ list.last([1, 2, 3, 4, 5])
+ |> should.equal(Ok(5))
+}