Skip to content

faramozzayw/rustype

Repository files navigation

Rustype 🦀

Type-safe variant, result and vector straight (well, almost) from Rust language. Helps to cope with situations where, for example, a value may be missing - we have a stylish API, no more boring code like if stuff == null {...} else {...}

Minified Version Types Dependency count

Install

Using npm

npm i @faramo.zayw/rustype

Using yarn

yarn add @faramo.zayw/rustype

Supporting IE11 and obsolete platforms

This library uses features like destructuring assignment, for..of and const/let declarations and doesn't ship with ES5 transpiled sources. If you aim to support browsers like IE11 and below → make sure you run Babel over your node_modules

Usage

Option<T>

import { Option } from "@faramo.zayw/rustype";

interface User {
	id: number;
	firstName: string;
	lastName: string;
	email?: string;
	phone?: string;
	age: number;
}

const defaultUser: User = { ... };
const fetchUser = (userID: number): Option<User> => { ... };

const myUser = fetchUser(1297)
	.map(({ firstName, lastName, ...props }) => ({
		username: `@${firstName}_${lastName}`,
		...props,
	}))
	.filter(({ age }) => age > 18)
	.unwrapOr({ ...defaultUser });

Result<T, E>

import { Result, Err, Ok } from "@faramo.zayw/rustype";

const safeAdd = (a: number, b: number): Result<number, string> => {
	if (Number.isSafeInteger(a) && Number.isSafeInteger(b)) {
		const sum = a + b;
		return Number.isSafeInteger(sum)
			? Ok(sum)
			: Err("The sum result is not a safe integer.");
	}

	return Err("Some of the arguments are not safe integers.");
};

console.log(safeAdd(6, 7)); // Ok(13)
console.log(safeAdd(Infinity, 7)); // Err("Some of the arguments are not safe integers.")
console.log(safeAdd(Number.MAX_SAFE_INTEGER - 1, 7)); // Err("The sum result is not a safe integer.");

Vector<T>

import { Vector } from "@faramo.zayw/rustype";

const vec = new Vec(1, 2, 3, 4, 5, 6, 7, 8, 12)
	.repeat(3)
	.map(item => item % 2 * Math.random())
	.rotateLeft(5)
	.partition((item) => item % 2 === 0)

API Docs

You can see the documentation here.

Alternatives?

  • monads - «Type safe Option, Result, and Either types; inspired by Rust.»
  • rusted - «Rust's syntax features for javascript.»
  • @pacote/option - «Option type inspired by Rust.»
  • ReScript - «The JavaScript-like language you have been waiting for.»

License

MIT