6
34%
MIT
A simple Maybe library in Reason.

reason-maybe

A simple Maybe library in Reason.

forthebadge forthebadge

Made with Reason

Installation

  • Install Yarn.
  • Run yarn add reason-maybe.
  • Add reason-maybe to your bs-dependencies in bsconfig.json

bsconfig.json

"bs-dependencies": [
  "reason-maybe"
]

Usage

from

To create a Maybe use Maybe.from:

  • RE
  • ML
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:

  • RE
  • ML
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 ||>:

  • RE
  • ML
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:

  • RE
  • ML
let value = onePlusOne |> Maybe.value(0); /* 2 */
let value = onePlusOne |> (Maybe.value 0)

Alternatively, you can import the equivalent infix operator >|:

  • RE
  • ML
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:

  • RE
  • ML
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 |||>:

  • RE
  • ML
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:

  • RE
  • ML
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 <->:

  • RE
  • ML
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.

Development

  1. Clone this repo.
  2. Move to this directory with cd reason-maybe.
  3. Install Yarn.
  4. Run yarn.

Build

npm run build

Build + Watch

npm run start

License

MIT