From 8367d45862c59889e1b9824bab2e11645c09521f Mon Sep 17 00:00:00 2001 From: Tomasz Chojnacki Date: Fri, 3 Mar 2023 17:43:42 +0100 Subject: Finish day 9 --- aoc-2020-gleam/src/ext/iteratorx.gleam | 13 +++++++++++++ aoc-2020-gleam/src/ext/listx.gleam | 10 ++++++++++ 2 files changed, 23 insertions(+) (limited to 'aoc-2020-gleam/src/ext') 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) +} -- cgit v1.2.3