You are currently looking at the < v8.2.0 docs (Reason v3.6 syntax edition). You can find the latest API docs here.
(These docs cover all versions between v3 to v8 and are equivalent to the old BuckleScript docs before the rebrand)
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)
RElet someString: option(string) = Some("foo");
getExn
let getExn: option('a) => 'a;
Raises an Error in case None
is provided. Use with care.
REBelt.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.
RElet 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
.
REBelt.Option.map(Some(3), x => x * x); /* Some(9) */
Belt.Option.map(None, x => x * x); /* None */
mapU
let mapU: (option('a), [@bs] ('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('a)
.
RElet 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), [@bs] ('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.
REBelt.Option.getWithDefault(None, "Banana"); /* Banana */
Belt.Option.getWithDefault(Some("Apple"), "Banana"); /* Apple */
RElet greet = (firstName: option(string)) =>
Belt.Option.("Greetings " ++ firstName->getWithDefault("Anonymous"));
Some("Jane")->greet; /* "Greetings Jane" */
None->greet; /* "Greetings Anonymous" */
REBelt.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.
REBelt.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.
REBelt.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.
RElet clockEqual = (a, b) => a mod 12 == b mod 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.
RElet clockCompare = (a, b) => compare(a mod 12, b mod 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.