Monads
Option, Result, and Either types for TypeScript - Inspired by Rust 🦀
Install / Use
/learn @slavovojacek/MonadsREADME
<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
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
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
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
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"
Related Skills
himalaya
343.1kCLI to manage emails via IMAP/SMTP. Use `himalaya` to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
Writing Hookify Rules
90.0kThis skill should be used when the user asks to "create a hookify rule", "write a hook rule", "configure hookify", "add a hookify rule", or needs guidance on hookify rule syntax and patterns.
