If you use this repo, star it ✨
👻 Option, Result, and Either types for JavaScript
Inspired by Rust
Zero dependencies 💪
Install
Node.js and the browser
npm install @sniptt/monads
Deno
import { Some } from 'https://deno.land/x/monads/mod.ts'
Some('air').unwrapOr('baloon') // "air"
None.unwrapOr('baloon') // "baloon"
Usage
Option<T>
Full documentation
import { Option, Some, None } from '@sniptt/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"
Result<T, E>
Full documentation
import { Result, Ok, Err } from "@sniptt/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")
Either<L, R>
Full documentation
import { Either } from '@sniptt/monads';
const getLabel = (uncertainDate: Either<Date, string>): string => {
return uncertainDate.match({
left: date => date.toLocaleDateString(),
right: text => `<abbr title="${text}">an uncertain date</abbr>`,
});
};
API Docs
License
See LICENSE