Useful augmentations, decorators and function to deal with errors in Golo.
null
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
Alias for isPresent
Test if this optional contains a value equals to the provided one.
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
Create a catcher that execute the given block dealing with exceptions.
This is similar to trying, but encapsulate the catch function
instead of returning a Result. It is also similar to catching,
but the block is the block take no parameter and is immediately executed.
let recover = catcher(|ex| -> match {
  when ex oftype IllegalArgumentException.class then "default"
  otherwise ""
})
let result = recover({
  let a = bar()
  let r = foo(42)
  return "foo: " + r
)}
This function can be used as a decorator:
@!catcher
function recoverIAE = |ex| -> match {
  when ex oftype IllegalArgumentException.class then "default"
  otherwise ""
}
let result = recoverIAE({
  let a = bar()
  let r = foo(42)
  return "foo: " + r
})
It is somewhat equivalent to a trying followed by either as in:
let recover = |ex| -> match { ... }
result = catcher(recover)({
  // some code that can fail
})
result = trying({
  // some code that can fail
}): either(^gololang.Functions::id, recover)
recover: the value to return if a exception occurred, or the function
to apply to the exception.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.
default: the value to return if a exception occurred, or the function
to apply to the exception.Constructor for an empty gololang.error.Result.
Constructor for gololang.error.Result errors.
message: the message for the error in the ResultConstructor for an empty java.util.Optional.
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.
Constructor for gololang.error.Result values.
value: the value to encapsulate in the Result“Smart” constructor for java.util.Optional.
If the given value is already an Optional, returns it unchanged; if it's a
Result, converts it into an Optional, and create an Optional otherwise
(using ofNullable)
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.
See also raising
Transforms a function returning a result or an option into a function returning the associated value or raising an exception.
This is the inverse behavior of result and option
Can be used as a decorator.
“Smart” constructor for gololang.error.Result.
If the given value is already a Result, returns it unchanged
and create an Optional otherwise.
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.
Constructor java.util.Optional values.
value: the value to encapsulate in the OptionalExecute 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.