Current section
Files
Jump to
Current section
Files
src/embeds/internal.gleam
import gleam/list
/// Like filter_map, but collect all errors, without early returning.
pub fn traverse_map(
list: List(a),
body: fn(a) -> Result(ok, List(err)),
) -> Result(List(ok), List(err)) {
do_traverse_map(list, body, [], [])
}
fn do_traverse_map(
list: List(a),
body: fn(a) -> Result(ok, List(err)),
oks: List(ok),
errs: List(err),
) -> Result(List(ok), List(err)) {
case list {
[] ->
case errs {
[] -> Ok(list.reverse(oks))
_ -> Error(list.reverse(errs))
}
[head, ..tail] ->
case body(head) {
Ok(ok) -> do_traverse_map(tail, body, [ok, ..oks], errs)
Error(err) -> do_traverse_map(tail, body, oks, list.append(err, errs))
}
}
}
pub fn try(
result: Result(ok, err),
f: fn(ok) -> Result(ok2, List(err)),
) -> Result(ok2, List(err)) {
case result {
Ok(ok) -> f(ok)
Error(err) -> Error([err])
}
}