Result
Result ok err :
[
Ok ok,
Err err
]
The result of an operation that could fail: either the operation went okay, or else there was an error of some sort.
is_ok : Result ok err -> Bool
Returns Bool.true
if the result indicates a success, else returns Bool.false
.
Result.is_ok(Ok(5))
is_err : Result ok err -> Bool
Returns Bool.true
if the result indicates a failure, else returns Bool.false
.
Result.is_err(Err("uh oh"))
with_default : Result ok err, ok -> ok
If the result is Ok
, returns the value it holds. Otherwise, returns
the given default value.
Note: This function should be used sparingly, because it hides that an error
happened, which will make debugging harder. Prefer using ?
to forward errors or
handle them explicitly with when
.
Result.with_default(Err("uh oh"), 42) # = 42 Result.with_default(Ok(7), 42) # = 7
map_ok : Result a err, (a -> b) -> Result b err
If the result is Ok
, transforms the value it holds by running a conversion
function on it. Then returns a new Ok
holding the transformed value. If the
result is Err
, this has no effect. Use map_err
to transform an Err
.
Result.map_ok(Ok(12), Num.neg) # = Ok(-12) Result.map_ok(Err("yipes!"), Num.neg) # = Err("yipes!")
Functions like map
are common in Roc; see for example List.map
,
Set.map
, and Dict.map
.
map_err : Result ok a, (a -> b) -> Result ok b
If the result is Err
, transforms the value it holds by running a conversion
function on it. Then returns a new Err
holding the transformed value. If
the result is Ok
, this has no effect. Use map_ok
to transform an Ok
.
List.last([]) |> Result.map_err(|_| ProvidedListIsEmpty) # = Err(ProvidedListIsEmpty) List.last([4]) |> Result.map_err(|_| ProvidedListIsEmpty) # = Ok(4)
on_err : Result a err, (err -> Result a other_err) -> Result a other_err
If the result is Err
, transforms the entire result by running a conversion
function on the value the Err
holds. Then returns that new result. If the
result is Ok
, this has no effect. Use ?
or try
to transform an Ok
.
Result.on_err(Ok(10), Str.to_u64) # = Ok(10) Result.on_err(Err("42"), Str.to_u64) # = Ok(42) Result.on_err(Err("string"), Str.to_u64) # = Err(InvalidNumStr)
on_err! : Result a err, (err => Result a other_err) => Result a other_err
Like on_err
, but it allows the transformation function to produce effects.
Result.on_err( Err("missing user"), |msg| Stdout.line!("ERROR: ${msg}")? Err(msg) )
map_both :
Result ok1 err1,
(ok1 -> ok2),
(err1 -> err2)
-> Result ok2 err2
Maps both the Ok
and Err
values of a Result
to new values.
map2 :
Result a err,
Result b err,
(a, b -> c)
-> Result c err
Maps the Ok
values of two Result
s to a new value using a given transformation,
or returns the first Err
value encountered.
try : Result a err, (a -> Result b err) -> Result b err
If the result is Ok
, transforms the entire result by running a conversion
function on the value the Ok
holds. Then returns that new result. If the
result is Err
, this has no effect.
We recommend using ?
instead of try
, it makes the code easier to read.
Result.try(Ok(-1), (|num| if num < 0 then Err("negative!") else Ok(-num))) # = Err("negative!") Result.try(Err("yipes!"), (|num| -> if num < 0 then Err("negative!") else Ok(-num))) # = Err("yipes!")