Skip to content

joelshepherd/match

Repository files navigation

mch

A fun library emulating (some of) the upcoming pattern matching proposal.

No dependencies and native TypeScript support.

Supports a variety of match types:

Type Examples Match method
Value when(20, ...) Strictly equals the exact value
Object when({ status: Number }, ...) Recursively passes each key condition
Constructor when(String, ...) Instance of the constructor
RegExp when(/hi/, ...) Tests positive against the RegExp
Compare Function when(x => x === 10, ...) Custom compare function
Default otherwise(...) Default fallback that maches anything

Install

npm install mch or yarn add mch

Usage

import { match, otherwise, when } from "mch"

Example usage returning a phrase based on a number.

const message = match(count, [
  when(0, () => "None for you"),
  when(1, () => "You have one"),
  when(Number, x => `You have ${x}`),
  otherwise(() => {
    throw new Error("Is this even a number?") // it's not
  }),
])

Example usage with React.

<div>
  {match(value, [
    when(0, () => <span>You have none</span>),
    when(Number, x => <span>You have {x}</span>),
    when(Error, error => <ErrorRender error={error}>),
  ])}
</div>

Example usage with async/await and a fetch response.

const response = await fetch(url)

const body = await match(response, [
  when({ status: /2\d\d/ }, res => res.json()),
  when({ status: 404 }, () => {
    throw new Error("404 Not Found")
  }),
])

Example usage the spirit of Rust's result convention.

function findValue(x: number): Result<number, string> {
  return x > 0 ? new Ok(x) : new Err("Invalid number")
}

const result = match(findValue(number), [
  when(Ok, ({ value }) => value),
  when(Err, () => 0),
])

About

A fun library emulating (some of) the upcoming pattern matching proposal.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published