👻 Monads
Type safe Option, Result, and Either types; inspired by Rust. Fork of @hqoss/monads (source)
Table of contents
⏳ Install
Node.js and the Browser
npm install @nvarner/monads
ES2018
and the library uses commonjs
module resolution.
📝 Usage
Option<T>
import { Option, Some, None } from "@nvarner/monads"
function 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>
import { Result, Ok, Err } from "@nvarner/monads"
function 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)
}
}
console.log(getIndex(["a", "b", "c"], "b")) // Ok(1)
console.log(getIndex(["a", "b", "c"], "z")) // Err("Value not found")
Either<L, R>
import { Either } from "@nvarner/monads"
function getLabel(uncertainDate: Either<Date, string>) {
return uncertainDate.match({
left: date => date.toLocaleDateString(),
right: text => `<abbr title="${text}">an uncertain date</abbr>`,
})
}