An implementation of the option type, sometimes known as the maybe type.

An instance of an option type is an optional value. Either it's `none`, or an
instance of `Some`:

```javascript
var option = require("option");

var some = option.some("Bob");
var none = option.none;
```   

A function that returns an optional string isn't that different from a function
that returns a string or `null`. The advantage over null is that options
provide a number of functions that help with manipulating optional values.

```javascript
    function greet(user) {
        return "Hello " + user.name().valueOrElse("Anonymous");
    }
```

## Methods

### isNone() and isSome()

* `some(value).isNone()` returns `false`
* `some(value).isSome()` returns `true`
* `none.isNone()` returns `true`
* `none.isSome()` returns `false`

### value()

* `some(value).value()` returns `value`
* `none.value()` throws an error

### map(*func*)

* `some(value).map(func)` returns `some(func(value))`
* `none.map(func)` returns `none`

### flatMap(*func*)

Conventionally used when `func` returns another option.

* `some(value).flatMap(func)` returns `func(value)`
* `none.flatMap(func)` returns `none`

### filter(*predicate*)

* `some(value).filter(predicate)` returns:
  * `some(value)` if `predicate(value) === true`
  * `none` if `predicate(value) === false`
* `none.filter(predicate)` returns `none`

### toArray()

* `some(value).toArray()` returns `[some]`
* `none.toArray()` returns `[]`

### orElse(*other*)

If `other` is a function (`other` conventionally returning another option):

* `some(value).orElse(other)` returns `some(value)`
* `none.orElse(other)` returns `other()`

If `other` is not a function (`other` conventionally being another option):

* `some(value).orElse(other)` returns `some(value)`
* `none.orElse(other)` returns `other`

### valueOrElse(*other*)

If `other` is a function:

* `some(value).valueOrElse(other)` returns `value`
* `none.valueOrElse(other)` returns `other()`

If `other` is not a function:

* `some(value).valueOrElse(other)` returns `value`
* `none.valueOrElse(other)` returns `other`

## Functions

### option.isOption(*value*)

* `option.isOption(value)` returns `true` if `value` is `option.none` or `option.some(x)`.

### option.fromNullable(*value*)

* If `value` is `null` or `undefined`, `option.fromNullable(value)` returns `option.none`.
* Otherwise, returns `option.some(value)`.
  For instance, `option.fromNullable(5)` returns `option.some(5)`.

## Installation

    npm install option
