aboutsummaryrefslogtreecommitdiff
path: root/aoc-2020-gleam/src/ext
diff options
context:
space:
mode:
authorTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-03-03 17:43:42 +0100
committerTomasz Chojnacki <tomaszchojnacki2001@gmail.com>2023-03-03 17:43:42 +0100
commit8367d45862c59889e1b9824bab2e11645c09521f (patch)
tree4f86f635148e06faa4e91daae647ef7f432b7aa3 /aoc-2020-gleam/src/ext
parent6c661db5b3e167d45554f7c5e4838dbc3bffa63a (diff)
downloadgleam_aoc2020-8367d45862c59889e1b9824bab2e11645c09521f.tar.gz
gleam_aoc2020-8367d45862c59889e1b9824bab2e11645c09521f.zip
Finish day 9
Diffstat (limited to 'aoc-2020-gleam/src/ext')
-rw-r--r--aoc-2020-gleam/src/ext/iteratorx.gleam13
-rw-r--r--aoc-2020-gleam/src/ext/listx.gleam10
2 files changed, 23 insertions, 0 deletions
diff --git a/aoc-2020-gleam/src/ext/iteratorx.gleam b/aoc-2020-gleam/src/ext/iteratorx.gleam
index 0ef5d51..65e06f2 100644
--- a/aoc-2020-gleam/src/ext/iteratorx.gleam
+++ b/aoc-2020-gleam/src/ext/iteratorx.gleam
@@ -10,3 +10,16 @@ pub fn count(iterator: Iterator(a), satisfying predicate: fn(a) -> Bool) -> Int
|> iter.filter(for: predicate)
|> length
}
+
+pub fn filter_map(
+ iterator: Iterator(a),
+ with mapper: fn(a) -> Result(b, c),
+) -> Iterator(b) {
+ iterator
+ |> iter.flat_map(with: fn(elem) {
+ case mapper(elem) {
+ Ok(new) -> iter.single(new)
+ Error(_) -> iter.empty()
+ }
+ })
+}
diff --git a/aoc-2020-gleam/src/ext/listx.gleam b/aoc-2020-gleam/src/ext/listx.gleam
index 2d4f4b6..8d20bd6 100644
--- a/aoc-2020-gleam/src/ext/listx.gleam
+++ b/aoc-2020-gleam/src/ext/listx.gleam
@@ -1,4 +1,6 @@
+import gleam/pair
import gleam/iterator as iter
+import gleam/result as res
import ext/iteratorx as iterx
pub fn count(list: List(a), satisfying predicate: fn(a) -> Bool) -> Int {
@@ -18,3 +20,11 @@ fn set_helper(list: List(a), value: a, index: Int, counter: Int) -> List(a) {
pub fn set(list: List(a), value: a, at index: Int) -> List(a) {
set_helper(list, value, index, 0)
}
+
+pub fn index_of(list: List(a), value: a) -> Result(Int, Nil) {
+ list
+ |> iter.from_list
+ |> iter.index
+ |> iter.find(one_that: fn(elem) { pair.second(elem) == value })
+ |> res.map(with: pair.first)
+}