reason-maybe
A simple Maybe library in Reason.
Installation
- Install Yarn.
- Run
yarn add reason-maybe
. - Add
reason-maybe
to yourbs-dependencies
inbsconfig.json
bsconfig.json
"bs-dependencies":
Usage
from
To create a Maybe use Maybe.from
:
let one = Maybe.from(Some(1)); /* Just(1) */
map
To map a function on the Maybe, use Maybe.map
:
let plusOne = x => x + 1;let onePlusOne = one |> Maybe.map(plusOne); /* Just(2) */
Alternatively, you can import the equivalent infix operator ||>
:
let (||>) = Maybe.(||>); let onePlusOne = one ||> plusOne; /* Just(2) */
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 */
Alternatively, you can import the equivalent infix operator >|
:
let (>|) = Maybe.(>|); let value = onePlusOne >| 0; /* 2 */
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) */
Alternatively, you can import the equivalent infix operator |||>
:
let (|||>) = Maybe.(|||>); let twoPlusOneMaybe = two |||> plusOneMaybe; /* Just(3) */
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 => vlet 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 */
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 */
This form is less readable but more terse yields the same result.
Development
- Clone this repo.
- Move to this directory with
cd reason-maybe
. - Install Yarn.
- Run
yarn
.
Build
npm run build
Build + Watch
npm run start
License
MIT