Useful augmentations, decorators and function to deal with errors in Golo.
Conjunctive chaining.
This is equivalent to :flatMap(|_| -> other),
i.e. applicative or monadic sequence with discarding.
(Can also be seen as :map(const(^id)): apply(other))
For instance:
Some(1): `and(None()) == None()
None(): `and(Some(1)) == None()
Some(1): `and(Some("2") == Some("2")
Note that this method is eager. If you want laziness, use the flatMap
equivalent.
other the other optionalother if this optional is present, otherwise thisSame as map or flatMap, depending on the type returned by f.
This is a generic version for map and flatMap: if f returns an
Optional, it's equivalent to flatMap, otherwise, it's equivalent to map.
This allows code such as:
Some(21): andThen(|x| -> x + 1): andThen(|x| -> Some(2 * x)) == Some(42)
Apply the function contained is this optional to the given optional. If the
function has several parameters, an optional containing a partialized version
is returned, that can be applyed to subsequent optionals.
This makes Optional an “applicative functor”.
For instance: let f = Some(|x| -> x + 10) f: apply(Some(32)) # Some(42) f: apply(None()) # None()
Some(|a, b| -> a + b): apply(Some(21)): apply(Some(21)) # Some(42)
Case analysis for the option.
If the result is not empty, apply the first function (similar to flatMap),
otherwise invoke the second function (similar to orElseGet). For instance:
Some(21): either(|x| -> x * 2, -> "plop") == 42
None(): either(|x| -> x * 2, -> "plop") == "plop"
This is indeed equivalent to
opt: map(mapping): orElseGet(default)
mapping: the function to apply to the contained valuedefault: the function to invoke if the option is empty (takes no arguments)Remove one level of optional.
This is actually equivalent to :flatMap(identity)
(or :flatMap(f) is equivalent to :map(f): flattened()).
For instance:
Some(Some(42)): flattened() == Some(42)
None(): flattened() == None()
Some(None()): flattened() == None()
Test if this optional is empty.
Alias for isEmpty
Test if this optional contains a value equals to the provided one.
Alias for isPresent
Disjunctive chaining.
For instance:
Some(1): `or(Some(2)) == Some(1)
None(): `or(Some(1)) == Some(1)
Some(1): `or(None()) == Some(1)
None(): `or(None()) == None()
Note that this method is eager.
Some(1): orElseGet(-> Some(2)) None(): orElseGet(-> Some(2))
other the other optionalother if this optional is empty, otherwise thisReduce this option using func with init as initial value.
For instance:
Some("b"): reduce("a", |x, y| -> x + y) == "ab"
None(): reduce(42, |x, y| -> x + y) == 42
init the initial valuefunc the aggregation functionConvert this optional into a list
Allows an unary function to be called with an Optional or a Result value.
Similar to flatMap, but using default on the exception if the call failed.
For instance:
let foo = |x| -> x: toUpperCase()
let safeFoo = catching("plop")(foo)
safeFoo(null) # "plop"
safeFoo(None()) # "plop"
safeFoo(Error("err")) # "plop"
safeFoo(Ok("a")) # "A"
safeFoo(Some("a")) # "A"
catching(^gololang.error.Result::error)(foo)(null) # Result.error(NullPointerException())
Can be used as a decorator.
Transform a function into one that can return null if something went wrong
(i.e. None, Error or exception).
Can be used as a decorator.
Transform a function raising an exception into a function returning a option.
The resulting function returns Option(f(x)) if f(x) succeeds and None if
f(x) raises an exception.
Can be used as a decorator.
Transforms a function returning a result or an option into a function returning the associated value or raising an exception.
Can be used as a decorator.
Transform a function raising an exception into a function returning a Result.
The resulting function returns Result.ok(f(x)) if f(x) succeeds and
Result.error(e) if f(x) raises e.
Can be used as a decorator.
Execute the given block and return a Result.
This is similar to result, except that the block take no parameter and is
immediately executed. This is not a decorator, but rather a replacement for a
try catch block.
For instance:
let res = trying({
let f = foo()
let x = bar()
let z = f(x)
return z + plop()
})
If any of the operation in the block raises an exception, res will be a
Result.error containing the exception, otherwise it will be a Result.ok
containing the returned value.