Skip to content

Latest commit

 

History

History
79 lines (57 loc) · 1.78 KB

README.md

File metadata and controls

79 lines (57 loc) · 1.78 KB

Variant-ts

Variant, Option and Result types for Typescript

Variants

import { Variant, variant } from "variant-ts";

type Connection =
  | Variant<"IPV4", [number, number, number, number]>
  | Variant<"IPV6", string>;

let ip = variant<Connection>("IPV4", [127, 0, 0, 1]);

Variants are very handy when used together with reducers:

import { Variant, variant, pattern } from "variant-ts";
import { match } form "ts-pattern";

type State = {
    name: string,
    age: number,
    messages: string[]
}

type Action =
    Variant<"ChangeName", string>
    | Variant<"ChangeAge", number>
    | Variant<"AddMessage", string>

function reducer(state: State, action: Action): State {
    return match(action)
        .with(pattern("ChangeName"), res => { return { name: res.val, ...state } })
        .with(pattern("ChangeAge"), res => { return { age: res.val, ...state } })
        .with(pattern("AddMessage"), res => { return { messages: [...state.messages, res.val], ...state } })
        .exhaustive()
}

let initial_state = {
    name: "John Doe",
    age: 24,
    messages: ["Hey, how are you?", "See you"]
}

let new_state = reducer(initial_state, variant<Action>("AddMessage", "Variants are awesome"))

Options

import { none, some } from "variant-ts";

const one = some("foo");
const two = none();

const three = one.map((x) => x.concat("bar"));
const four = two.map((x) => x.concat("bar"));

expect(three.val).to.equal("foobar");
expect(four.val).to.equal(undefined);

Results

import { err, ok } from "variant-ts";

const one = ok("foo");
const two = err("error");

const three = one.map((x) => x.concat("bar"));
const four = two.map((x) => x.concat("bar"));

expect(three.val).to.equal("foobar");
expect(four.val).to.equal("error");