variants-ts

1.0.1 • Public • Published

variants-ts

This package gives some simple primitives to use variants in TypeScript

Examples

type PartialData =
    | Variant<"nothing", null>
    | Variant<"string", string>
    | Variant<"number", number>
    | Variant<"all", string[]>

async function getData(): Promise<PartialData> {
    const stringResult: Result<string> = await fetch("https://example.com")
        .then((res) => res.text())
        .then(ok)
        .catch(err)

    if (iserr(stringResult)) {
        // Avoid indented try/catch blocks
        return variant("nothing", null);
    }

    // Use ok or err as a transformation in a chain
    const numberResult: Result<number> = await fetch(`https://example.com/${stringResult.data}`)
        .then(Number)
        .then(Math.abs)
        .then(ok)
        .catch(err);

    if (iserr(numberResult)) {
        return variant("string", stringResult.data);
    }

    if (Number.isNaN(numberResult.data)) {
        // Handle custom error cases
        return variant("string", stringResult.data);
    }

    const allResult: Result<string[]> = await fetch(`https://example.com/data?limit=${numberResult.data}`)
        .then((res) => res.json())
        .then(ok)
        .catch(err);

    if (iserr(allResult)) {
        return variant("number", numberResult.data);
    }

    return variant("all", allResult.data);
}

// Match on the result
const matcher = match<PartialData, string>({
    nothing: () => "Nothing found",
    string: (v) => `Found string: ${v}`,
    number: (v) => `Found number: ${v}`,
    all: (v) => `Found all: ${v.join(", ")}`,
});

// Use the matcher as a transformation
const message = await getData().then(matcher)

console.log(message);

Package Sidebar

Install

npm i variants-ts

Weekly Downloads

9

Version

1.0.1

License

MIT

Unpacked Size

8.78 kB

Total Files

6

Last publish

Collaborators

  • vhgn