# @thames/monads

> Option, Result, and Either types for JavaScript - Inspired by Rust

Latest version **0.7.0** (published 2024-06-16) · MIT license · 0 weekly downloads

## Install

```sh
npm install @thames/monads
pnpm add @thames/monads
yarn add @thames/monads
bun add @thames/monads
```

## Health

**Score 30/100 (F)** — status: abandoned.

Positive: has types; esm support; no vulnerabilities; high quality score.

Warnings: low downloads; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.7.0 |
| Published | 2024-06-16 |
| First published | 2024-04-08 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Node | >=18 |
| Dependencies | 0 |
| Unpacked size | 53.3 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Slavo Vojacek |
| Maintainers | richardbranson |
| Keywords | monads, option, result, either, javascript, js, typescript, node, node.js |

## Links

- npm: https://www.npmjs.com/package/@thames/monads
- Homepage: https://github.com/thames-technology/monads
- Issues: https://github.com/thames-technology/monads/issues
- npm.io page: https://npm.io/package/@thames/monads

## Alternatives

- [@mapbox/jsonlint-lines-primitives](https://npm.io/package/@mapbox/jsonlint-lines-primitives.md) — 5.3M weekly downloads
- [reftools](https://npm.io/package/reftools.md) — 3.5M weekly downloads
- [@hey-api/openapi-ts](https://npm.io/package/@hey-api/openapi-ts.md) — 3.5M weekly downloads
- [@mapbox/geojson-rewind](https://npm.io/package/@mapbox/geojson-rewind.md) — 2.4M weekly downloads
- [turbo-stream](https://npm.io/package/turbo-stream.md) — 1.7M weekly downloads

## Recent versions

- 0.7.0 (latest) — 2024-06-16
- 0.6.2 — 2024-04-08
- 0.6.0 — 2024-04-08

## README

<p align="center">
  <a href="https://thames-technology.github.io/monads">
    <img src="https://raw.githubusercontent.com/thames-technology/monads/main/.github/assets/monads-cover.png" alt="Monads Logo" />
  </a>
</p>

<p align="right">
  <i>If you use this repo, star it ✨</i>
</p>

---

<h2 align="center">Option, Result, and Either types for JavaScript</h2>

<p align="center">
  🦀 Inspired by <a href="https://doc.rust-lang.org/stable/std/option/" target="_blank">Rust</a>
</p>

<p align="center">
  <b>Zero dependencies</b> • <b>Lightweight</b> • <b>Functional</b>
</p>

---

## Install

```sh
npm install @thames/monads
```

## Getting started

### The `Option<T>` type

Option represents an optional value: every Option is either Some and contains a value, or None, and does not.

> [!NOTE]
> Full documentation here: [Option](https://thames-technology.github.io/monads/interfaces/Option.html)

```ts
import { Option, Some, None } from '@thames/monads';

const divide = (numerator: number, denominator: number): Option<number> => {
  if (denominator === 0) {
    return None;
  } else {
    return Some(numerator / denominator);
  }
};

// The return value of the function is an option
const result = divide(2.0, 3.0);

// Pattern match to retrieve the value
const message = result.match({
  some: (res) => `Result: ${res}`,
  none: 'Cannot divide by 0',
});

console.log(message); // "Result: 0.6666666666666666"
```

### The `Result<T, E>` type

Result represents a value that is either a success (Ok) or a failure (Err).

> [!NOTE]
> Full documentation here: [Result](https://thames-technology.github.io/monads/interfaces/Result.html)

```ts
import { Result, Ok, Err } from '@thames/monads';

const getIndex = (values: string[], value: string): Result<number, string> => {
  const index = values.indexOf(value);

  switch (index) {
    case -1:
      return Err('Value not found');
    default:
      return Ok(index);
  }
};

const values = ['a', 'b', 'c'];

getIndex(values, 'b'); // Ok(1)
getIndex(values, 'z'); // Err("Value not found")
```

### The `Either<L, R>` type

Either represents a value that is either Left or Right. It is a powerful way to handle operations that can result in two distinctly different types of outcomes.

> [!NOTE]
> Full documentation here: [Either](https://thames-technology.github.io/monads/interfaces/Either.html)

```ts
import { Either, Left, Right } from '@thames/monads';

const divide = (numerator: number, denominator: number): Either<string, number> => {
  if (denominator === 0) {
    return Left('Cannot divide by 0');
  } else {
    return Right(numerator / denominator);
  }
};

const result = divide(2.0, 3.0);

const message = result.match({
  left: (err) => `Error: ${err}`,
  right: (res) => `Result: ${res}`,
});

console.log(message); // "Result: 0.6666666666666666"
```

---
_Source: https://npm.io/package/@thames/monads · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
