6
36%
MIT
A simple Maybe library in Reason.

# reason-maybe

A simple Maybe library in 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.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/"))
|> (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 ])) |||>
|> (noslug <-> hasslug))
>| "/articles"
let validArticleRoute = getArticleRoute "awesome"
let _ = Js.log validArticleRoute
let invalidArticleRoute = getArticleRoute ""

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`` 