From 86167af22b262b424902b5b9af1b2b55d304d149 Mon Sep 17 00:00:00 2001 From: Giacomo Cavalieri Date: Sun, 7 May 2023 00:48:07 +0200 Subject: `result.partition` test and implementation --- src/gleam/result.gleam | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src') diff --git a/src/gleam/result.gleam b/src/gleam/result.gleam index 61e99e9..100d36d 100644 --- a/src/gleam/result.gleam +++ b/src/gleam/result.gleam @@ -366,6 +366,36 @@ pub fn all(results: List(Result(a, e))) -> Result(List(a), e) { list.try_map(results, fn(x) { x }) } +/// TODO Add doc! +pub fn partition(results: List(Result(a, e))) -> Result(List(a), List(e)) { + case results { + [] -> Ok([]) + [Ok(a), ..rest] -> do_partition(rest, Ok([a])) + [Error(b), ..rest] -> do_partition(rest, Error([b])) + } +} + +fn do_partition(results: List(Result(a, b)), acc: Result(List(a), List(b))) { + case results { + [] -> + acc + |> map(list.reverse) + |> map_error(list.reverse) + + [Ok(a), ..rest] -> + case acc { + Ok(all_as) -> do_partition(rest, Ok([a, ..all_as])) + Error(all_bs) -> do_partition(rest, Error(all_bs)) + } + + [Error(b), ..rest] -> + case acc { + Ok(_) -> do_partition(rest, Error([b])) + Error(all_bs) -> do_partition(rest, Error([b, ..all_bs])) + } + } +} + /// Replace the value within a result /// /// ## Examples -- cgit v1.2.3