Option
In Belt we represent the existence and nonexistence of a value by wrapping it
with the option
type. In order to make it a bit more convenient to work with
option-types, Belt provides utility-functions for it.
The option
type is a part of the Reason / OCaml standard library which is defined like this:
type option<'a> = None | Some('a)
RESlet someString: option<string> = Some("hello")
getExn
let getExn: option<'a> => 'a
Raises an Error in case None
is provided. Use with care.
RESBelt.Option.getExn(Some(3)) /* 3 */
Belt.Option.getExn(None) /* Raises an Error */
mapWithDefault
let mapWithDefault: (option<'a>, 'b, 'a => 'b) => 'b
If optionValue
is of Some(value)
,
this function returns that value applied with f
, in other words f(value)
.
If optionValue
is None
, the default is returned.
RESlet someValue = Some(3)
someValue->Belt.Option.mapWithDefault(0, x => x + 5) /* 8 */
let noneValue = None
noneValue->Belt.Option.mapWithDefault(0, x => x + 5) /* 0 */
mapWithDefaultU
let mapWithDefaultU: (option<'a>, 'b, (. 'a) => 'b) => 'b
Uncurried version of mapWithDefault.
map
let map: (option<'a>, 'a => 'b) => option<'b>
If optionValue
is Some(value)
this returns f(value)
, otherwise it returns None
.
RESBelt.Option.map(Some(3), x => x * x) /* Some(9) */
Belt.Option.map(None, x => x * x) /* None */
mapU
let mapU: (option<'a>, (. 'a) => 'b) => option<'b>
Uncurried version of map.
flatMap
let flatMap: (option<'a>, 'a => option<'b>) => option<'b>
If optionValue
is Some(value)
, returns f(value)
, otherwise returns
None
.
The function f
must have a return type of option<'b>
.
RESlet addIfAboveOne = value =>
if (value > 1) {
Some(value + 1)
} else {
None
}
Belt.Option.flatMap(Some(2), addIfAboveOne) /* Some(3) */
Belt.Option.flatMap(Some(-4), addIfAboveOne) /* None */
Belt.Option.flatMap(None, addIfAboveOne) /* None */
flatMapU
let flatMapU: (option<'a>, (. 'a) => option<'b>) => option<'b>
Uncurried version of flatMap.
getWithDefault
let getWithDefault: (option<'a>, 'a) => 'a
If optionalValue
is Some(value)
, returns value
, otherwise default.
RESBelt.Option.getWithDefault(None, "Banana") /* Banana */
Belt.Option.getWithDefault(Some("Apple"), "Banana") /* Apple */
RESlet greet = (firstName: option<string>) =>
"Greetings " ++ firstName->Belt.Option.getWithDefault("Anonymous")
Some("Jane")->greet /* "Greetings Jane" */
None->greet /* "Greetings Anonymous" */
RESBelt.Option.getWithDefault(Some(1812), 1066) /* 1812 */
Belt.Option.getWithDefault(None, 1066) /* 1066 */
isSome
let isSome: option<'a> => bool
Returns true
if the argument is Some(value)
, false
otherwise.
RESBelt.Option.isSome(None) /* false */
Belt.Option.isSome(Some(1)) /* true */
isNone
let isNone: option<'a> => bool
Returns true
if the argument is None
, false
otherwise.
RESBelt.Option.isNone(None) /* true */
Belt.Option.isNone(Some(1)) /* false */
eq
let eq: (option<'a>, option<'b>, ('a, 'b) => bool) => bool
Evaluates two optional values for equality with respect to a predicate
function. If both optValue1
and optValue2
are None
, returns true
.
If one of the arguments is Some(value)
and the other is None
, returns
false
.
If arguments are Some(value1)
and Some(value2)
, returns the result of
predicate(value1, value2)
; the predicate function must return a bool.
RESlet clockEqual = (a, b) => mod(a, 12) == mod(b, 12)
open Belt.Option
eq(Some(3), Some(15), clockEqual) /* true */
eq(Some(3), None, clockEqual) /* false */
eq(None, Some(3), clockEqual) /* false */
eq(None, None, clockEqual) /* true */
eqU
let eqU: (option<'a>, option<'b>, (.'a, 'b) => bool) => bool
Uncurried version of eq.
cmp
let cmp: (option<'a>, option<'b>, ('a, 'b) => int) => int
cmp(optValue1, optValue2, comparisonFunction)
compares two optional values
with respect to given comparisonFunction
.
If both optValue1
and optValue2
are None
, it returns 0
.
If the first argument is Some(value1)
and the second is None
, returns 1
(something is greater than nothing).
If the first argument is None
and the second is Some(value2)
, returns -1
(nothing is less than something).
If the arguments are Some(value1)
and Some(value2)
, returns the result of
comparisonFunction(value1, value2)
; comparisonFunction takes two arguments
and returns -1
if the first argument is less than the second, 0
if the
arguments are equal, and 1
if the first argument is greater than the second.
RESlet clockCompare = (a, b) => compare(mod(a, 12), mod(b, 12))
open Belt.Option
cmp(Some(3), Some(15), clockCompare) /* 0 */
cmp(Some(3), Some(14), clockCompare) /* 1 */
cmp(Some(2), Some(15), clockCompare) /* (-1) */
cmp(None, Some(15), clockCompare) /* (-1) */
cmp(Some(14), None, clockCompare) /* 1 */
cmp(None, None, clockCompare) /* 0 */
cmpU
let cmpU: (option<'a>, option<'b>, ((.'a, 'b) => int)) => int
Uncurried version of cmp.