pattycake
pattycake
is a little playground being
used to prototype concepts surrounding the TC39 pattern matching
proposal. It's not a spec,
it's not a standard, and it doesn't represent the actual look and feel of the JS
feature. But it'll help figure out what that could actually be!
Install
$ npm install pattycake
Table of Contents
Example
import match, {$} from 'pattycake'
const res = await fetch(jsonService)
const val = match (res) (
{
status: 200,
headers: {'Content-Length': $}
}, ({
headers: {'Content-Length', s}}
) => `size is ${s}`,
{status: 404}, () => 'JSON not found',
$({status: $}, ({status}) => status >= 400), () => throw new RequestError(res)
)
API
This documentation described the sugared version of the match
expression. The
API exported by pattycake
is similar, but uses functions and different syntax
for the same underlying concepts.
To convert a sugary match
to a pattycake
match:
- Replace the main
{}
pair with()
- Separate match clauses and bodies into matcher expressions and a fat arrow function, using the parameter list for the fat arrow for destructuring.
- Replace any variable clauses in the match side with
match.$
. - If using guards, convert the guard to a function and pass it as the last argument to
match.$
. If you weren't already usingmatch.$
for a certain clause (because it wasn't necessary), wrap that clause withmatch.$
and pass the guard function as the second argument. - If using
...rest
s with array or object matchers, replace the...rest
with$.rest
and destructure the array in the fat arrow body.
Example
match (x) {
{a: 1, b} => ...,
[1, 2, ...etc] => ...,
1 => ...,
'string' => ...,
true => ...,
null => ...,
/regexhere/ => ...
}
// Converts to...
const $ = match.$
match (x) (
{a: 1, b: $}, ({b}) => ...,
[1, 2, $.rest], ([a, b, ...etc]) => ...,
1, () => ...,
'string', () => ...,
true, () => ...,
null, () => ...,
/regexhere/, () => ...
)