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!
$ npm install pattycake
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)
)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
...rests with array or object matchers, replace the...restwith$.restand destructure the array in the fat arrow body.
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/, () => ...
)