1.0.0-beta.1 • Published 11 months ago

@miyauci/pattern-matching v1.0.0-beta.1

Weekly downloads
-
License
MIT
Repository
github
Last release
11 months ago

pattern-matching

deno land deno doc GitHub release (latest by date) codecov License

test NPM standard-readme compliant semantic-release: angular

Syntax-free pattern matching, feature parity with TC39 proposal-pattern-matching.

This project provides syntax-independent, type-safe pattern matching tools.

Table of Contents

Install

deno.land:

import * as mod from "https://deno.land/x/pattern_matching/mod.ts";

npm:

npm i @miyauci/pattern-matching

Usage

To start pattern matching, use the match function and the arm function.

arm takes the role of Clause.

The names of the arm function and the proposal clause are as follows:

NameProposal name
whenwhen
whetherif
otherwisedefault
import {
  match,
  otherwise,
  when,
} from "https://deno.land/x/pattern_matching/mod.ts";

declare const num: number;

const result = match(num)(
  when(1, () => "one"),
  when(2, () => "two"),
  otherwise(() => "many"),
);

Binding

Binding binds the value of matchable when matched. This allows subsequent handlers to reference the binding.

import {
  _,
  match,
  otherwise,
  when,
  whether,
} from "https://deno.land/x/pattern_matching/mod.ts";
import {
  assertType,
  type IsExact,
} from "https://deno.land/std/testing/types.ts";

interface Person {
  name: string;
  age: number;
  hobby?: string;
  greet?: string;
}
declare const person: Person;

const result = match(person)(
  whether(({ name, age }) => !name || !age, () => {
    throw new Error();
  }),
  when(
    { greet: _("introduction") },
    ({ introduction }) => `${introduction}`,
  ),
  when(
    { name: _("name"), hobby: _("hobby") },
    ({ name, hobby }) => `${name} hobby is ${hobby}`,
  ),
  otherwise(() => "profile does not exist"),
);

assertType<IsExact<typeof result, string>>(true);

API

See deno doc for all APIs.

Contributing

See contributing.

License

MIT © 2023 Tomoki Miyauchi