reason-maybe v0.3.0
reason-maybe
A simple Maybe library in Reason.
Installation
- Install Yarn.
- Run
yarn add reason-maybe. - Add
reason-maybeto yourbs-dependenciesinbsconfig.json
bsconfig.json
"bs-dependencies": [
"reason-maybe"
]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 => 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 */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 buildBuild + Watch
npm run startLicense
MIT