Belt_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 ReScript standard library which is defined like this:
type option<'a> = None | Some('a)
RESlet someString: option<string> = Some("hello")
keepU
Uncurried version of keep
let keepU: (option<'a>, (. 'a) => bool) => option<'a>
keep
If optionValue
is Some(value)
and p(value) = true
, it returns Some(value)
; otherwise returns None
RESBelt.Option.keep(Some(10), x => x > 5) /* returns `Some(10)` */
Belt.Option.keep(Some(4), x => x > 5) /* returns `None` */
Belt.Option.keep(None, x => x > 5) /* returns `None` */
let keep: (option<'a>, 'a => bool) => option<'a>
forEachU
Uncurried version of forEach
let forEachU: (option<'a>, (. 'a) => unit) => unit
forEach
If optionValue
is Some(value
), it calls f(value)
; otherwise returns ()
RESBelt.Option.forEach(Some("thing"), x => Js.log(x)) /* logs "thing" */
Belt.Option.forEach(None, x => Js.log(x)) /* returns () */
let forEach: (option<'a>, 'a => unit) => unit
getExn
Raises an Error in case None
is provided. Use with care.
RESBelt.Option.getExn(Some(3)) /* 3 */
Belt.Option.getExn(None) /* Raises an Error */
let getExn: option<'a> => 'a
getUnsafe
getUnsafe(x)
returns x
This is an unsafe operation, it assumes x
is neither None
nor Some(None(...)))
let getUnsafe: option<'a> => 'a
mapWithDefaultU
Uncurried version of mapWithDefault
let mapWithDefaultU: (option<'a>, 'b, (. 'a) => 'b) => 'b
mapWithDefault
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 */
let mapWithDefault: (option<'a>, 'b, 'a => 'b) => 'b
mapU
Uncurried version of map
let mapU: (option<'a>, (. 'a) => 'b) => option<'b>
map
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 */
let map: (option<'a>, 'a => 'b) => option<'b>
flatMapU
Uncurried version of flatMap
let flatMapU: (option<'a>, (. 'a) => option<'b>) => option<'b>
flatMap
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 */
let flatMap: (option<'a>, 'a => option<'b>) => option<'b>
getWithDefault
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" */
let getWithDefault: (option<'a>, 'a) => 'a
orElse
orElse optionalValue otherOptional
If optionalValue
is Some value
, returns Some value
, otherwise otherOptional
orElse (Some 1812) (Some 1066) = Some 1812;; orElse None (Some 1066) = Some 1066;; orElse None None = None;;
let orElse: (option<'a>, option<'a>) => option<'a>
isSome
Returns true
if the argument is Some(value)
, false
otherwise.
RESBelt.Option.isSome(None) /* false */
Belt.Option.isSome(Some(1)) /* true */
let isSome: option<'a> => bool
isNone
Returns true
if the argument is None
, false
otherwise.
RESBelt.Option.isNone(None) /* true */
Belt.Option.isNone(Some(1)) /* false */
let isNone: option<'a> => bool
eqU
Uncurried version of eq
let eqU: (option<'a>, option<'b>, (. 'a, 'b) => bool) => bool
eq
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 */
let eq: (option<'a>, option<'b>, ('a, 'b) => bool) => bool
cmpU
Uncurried version of cmp
let cmpU: (option<'a>, option<'b>, (. 'a, 'b) => int) => int
cmp
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 */
let cmp: (option<'a>, option<'b>, ('a, 'b) => int) => int