monads
                                
                                
                                
                                    monads copied to clipboard
                            
                            
                            
                        Option, Result, and Either types for TypeScript - Inspired by Rust 🦀
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
Full API Documentation.
License
See LICENSE