A simple Maybe library in Reason.
yarn add reason-maybe
.reason-maybe
to your bs-dependencies
in bsconfig.json
bsconfig.json
"bs-dependencies": [
"reason-maybe"
]
from
To create a Maybe use Maybe.from
:
let one = Maybe.from(Some(1)); /* Just(1) */
let one = Maybe.from ((Some (1))[@explicit_arity ])
map
To map a function on the Maybe, use Maybe.map
:
let plusOne = x => x + 1;
let onePlusOne = one |> Maybe.map(plusOne); /* Just(2) */
let plusOne x = x + 1
let onePlusOne = one |> (Maybe.map plusOne)
Alternatively, you can import the equivalent infix operator ||>
:
let (||>) = Maybe.(||>);
let onePlusOne = one ||> plusOne; /* Just(2) */
let (||>) = Maybe.(||>)
let onePlusOne = one ||> plusOne
If the map operation provides a value, it will return Just(value)
. Else, it will return a Nothing
.
value
To extract the value of the Maybe, we need to use Maybe.value
:
let value = onePlusOne |> Maybe.value(0); /* 2 */
let value = onePlusOne |> (Maybe.value 0)
Alternatively, you can import the equivalent infix operator >|
:
let (>|) = Maybe.(>|);
let value = onePlusOne >| 0; /* 2 */
let (>|) = Maybe.(>|)
let value = onePlusOne >| 0
If the Maybe was actually a Nothing
, the value given to the Maybe.value
function will be the resulting value.
In this case if onePlusOne
was Nothing
, the value of value
would be 0
.
chain
To run a function that returns a Maybe on a Maybe, we use Maybe.chain
:
let two = Maybe.from(Some(2));
let plusOneMaybe = x => one |> Maybe.map(y => x + y);
let twoPlusOneMaybe = two |> Maybe.chain(plusOneMaybe); /* Just(3) */
let two = Maybe.from ((Some (2))[@explicit_arity ])
let plusOneMaybe x = one |> (Maybe.map (fun y -> x + y))
let twoPlusOneMaybe = two |> (Maybe.chain plusOneMaybe)
Alternatively, you can import the equivalent infix operator |||>
:
let (|||>) = Maybe.(|||>);
let twoPlusOneMaybe = two |||> plusOneMaybe; /* Just(3) */
let (|||>) = Maybe.(|||>)
let twoPlusOneMaybe = two |||> plusOneMaybe
We use the plusOneMaybe
function which returns a Maybe on the two
Maybe.
Instead of Maybe.map
, we use Maybe.chain
to lift it from the returned Maybe unto the current Maybe.
branch
If the Maybe has turned into a Nothing and you want to handle that, you can use Maybe.branch
:
let addToRoute = s => x =>
switch s {
| "" => Maybe.Nothing
| v => Maybe.Just(x ++ v)
}
;
let noslug = () => "/not_found";
let hasslug = v => v
let getArticleRoute = slug => Maybe.from(Some("/articles/"))
|> Maybe.chain(addToRoute(slug))
|> Maybe.branch(noslug, hasslug)
|> Maybe.value("/articles");
let validArticleRoute = getArticleRoute("awesome");
Js.log(validArticleRoute); /* /articles/awesome */
let invalidArticleRoute = getArticleRoute("");
Js.log(invalidArticleRoute); /* /not_found */
967: syntax error, consider adding a `;' before
Alternatively, you can import the equivalent infix operator <->
:
let (<->) = Maybe.(<->);
let (|||>) = Maybe.(|||>);
let (>|) = Maybe.(>|);
/* Previously defined functions here */
let getArticleRoute = slug =>
Maybe.from(Some("/articles/"))
|||> addToRoute(slug)
|> (noslug <-> hasslug)
>| "/articles"
;
let validArticleRoute = getArticleRoute("awesome");
Js.log(validArticleRoute); /* /articles/awesome */
let invalidArticleRoute = getArticleRoute("");
Js.log(invalidArticleRoute); /* /not_found */
let (<->) = Maybe.(<->)
let (|||>) = Maybe.(|||>)
let (>|) = Maybe.(>|)
let getArticleRoute slug =
(((Maybe.from ((Some ("/articles/"))[@explicit_arity ])) |||>
(addToRoute slug))
|> (noslug <-> hasslug))
>| "/articles"
let validArticleRoute = getArticleRoute "awesome"
let _ = Js.log validArticleRoute
let invalidArticleRoute = getArticleRoute ""
let _ = Js.log invalidArticleRoute
This form is less readable but more terse yields the same result.
cd reason-maybe
.yarn
.npm run build
npm run start
MIT