diff options
author | Louis Pilfold <louis@lpil.uk> | 2023-01-21 12:27:50 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2023-02-26 18:51:30 +0000 |
commit | e005df1fc88f957d2537453ccd8863eca324c5bd (patch) | |
tree | 1a9c970d63d9b5b3d4c7601cb070d5a9cb22a0fe | |
parent | 6bb693f1af14a3ddbc3fd28468e07197e46cbaa9 (diff) | |
download | gleam_stdlib-e005df1fc88f957d2537453ccd8863eca324c5bd.tar.gz gleam_stdlib-e005df1fc88f957d2537453ccd8863eca324c5bd.zip |
result.guard
-rw-r--r-- | src/gleam/result.gleam | 33 | ||||
-rw-r--r-- | test/gleam/result_test.gleam | 14 |
2 files changed, 47 insertions, 0 deletions
diff --git a/src/gleam/result.gleam b/src/gleam/result.gleam index e64e96a..c2d92a1 100644 --- a/src/gleam/result.gleam +++ b/src/gleam/result.gleam @@ -411,3 +411,36 @@ pub fn replace_error(result: Result(a, e1), error: e2) -> Result(a, e2) { pub fn values(results: List(Result(a, e))) -> List(a) { list.filter_map(results, fn(r) { r }) } + +/// Run a callback function if the given bool is `True`, otherwise return a +/// default error value. +/// +/// This function is suitable for `use` expressions. +/// +/// ## Examples +/// +/// ```gleam +/// > let name = "Kamaka" +/// > use <- guard(name != "", or: "Missing name") +/// > "Hello, " <> name +/// Ok("Hello, Kamaka") +/// ``` +/// +/// ```gleam +/// > let name = "" +/// > use <- guard(name != "", or: "Missing name") +/// > "Hello, " <> name +/// Error("Missing name") +/// ``` +/// +/// +pub fn guard( + requirement: Bool, + or error: e, + then consequence: fn() -> Result(a, e), +) -> Result(a, e) { + case requirement { + True -> consequence() + False -> Error(error) + } +} diff --git a/test/gleam/result_test.gleam b/test/gleam/result_test.gleam index 9075977..dc50dd8 100644 --- a/test/gleam/result_test.gleam +++ b/test/gleam/result_test.gleam @@ -205,3 +205,17 @@ pub fn values_test() { result.values([Ok(1), Error(""), Ok(3)]) |> should.equal([1, 3]) } + +pub fn guard_test() { + assert Ok(1) = { + let x = 1 + use <- result.guard(True, or: "nope") + Ok(x) + } + + assert Error("nope") = { + let x = 1 + use <- result.guard(False, or: "nope") + Ok(x) + } +} |