This is a `playground`

to test code. It runs a full `Node.js`

environment and already has all of `npm`

’s 400,000 packages pre-installed, including `pampy`

with all `npm`

packages installed. **Try it out**:

var pampy = require("pampy")

- all documents on RunKit are public
`require()`

any package directly from npm- use arrow functions, classes, template strings, and most of ES6
`await`

any promise instead of using callbacks (example)- create your own embedded
**node.js**snippets

This service is provided by RunKit and is not affiliated with npm, Inc or the package authors.

Pampy.js is pretty small (250 lines), reasonably fast, and often makes your code more readable, and easier to reason about. There is also a Python version of Pampy.

`
`

Patterns are evaluated in the order they appear.

`
`

The operator _ means "any other case I didn't think of". **If you already use _, you can require ANY, which is exactly the same**.

```
let {match, _} = require("pampy");
function fib(n) {
return match(n,
1, 1,
2, 1,
_, (x) => fib(x - 1) + fib(x - 2)
);
}
```

```
let {match, REST, _} = require("pampy");
function lisp(exp) {
return match(exp,
Function, (x) => x,
[Function, REST], (f, rest) => f.apply(null, rest.map(lisp)),
Array, (l) => l.map(lisp),
_, (x) => x
);
}
let plus = (a, b) => a + b;
let minus = (a, b) => a - b;
let reduce = (f, l) => l.reduce(f);
lisp([plus, 1, 2]); // => 3
lisp([plus, 1, [minus, 4, 2]]); // => 3
lisp([reduce, plus, [1, 2, 3]]); // => 6
```

```
let {match, _} = require("pampy");
match(x,
3, "this matches the number 3",
Number, "matches any javascript number",
[String, Number], (a, b) => "a typed list [a, b] that you can use in a function",
[1, 2, _], "any list of 3 elements that begins with [1, 2]",
{x: _}, "any dict with a key 'x' and any value associated",
_, "anything else"
)
```

```
let {match, _, TAIL} = require("pampy");
x = [1, 2, 3];
match(x, [1, TAIL], (t) => t); // => [2, 3]
match(x, [_, TAIL], (h, t) => [h, t]); // => [1, [2, 3])
```

```
let {match, _, TAIL} = require("pampy");
x = [1, [2, 3], 4];
match(x, [1, [_, 3], _], (a, b) => [1, [a, 3], b]); // => [1, [2, 3], 4]
```

```
pet = { type: 'dog', details: { age: 3 } };
match(pet, {details: {age: _}}, (age) => age); // => 3
match(pet, {_: {age: _}}, (a, b) => [a, b]); // => ['details', 3]
```

Admittedly using `_`

as key is a bit of a trick, but it works for most situations.

```
match(x,
x => x > 3, x => `${x} is > 3`,
x => x < 3, x => `${x} is < 3`,
x => x === 3, x => `${x} is = 3`
)
```

```
function fib(n) {
return matchPairs(
n,
[0, 0],
[1, 1],
[2, 1],
[3, 2],
[4, 3],
[_, x => fib(x - 1) + fib(x - 2)]
)
}
```

Pattern Example | What it means | Matched Example | Arguments Passed to function | NOT Matched Example |
---|---|---|---|---|

`"hello"` | only the string `"hello"` matches | `"hello"` | nothing | any other value |

`Number` | Any javascript number | `2.35` | `2.35` | any other value |

`String` | Any javascript string | `"hello"` | `"hello"` | any other value |

`Array` | Any array object | `[1, 2]` | `[1, 2]` | any other value |

`_` | Any object | that value | ||

`ANY` | The same as `_` | that value | ||

`[1, 2, _]` | A list that starts with 1, 2 and ends with any value | `[1, 2, 3]` | `3` | `[1, 2, 3, 4]` |

`[1, 2, TAIL]` | A list that start with 1, 2 and ends with any sequence | `[1, 2, 3, 4]` | `[3, 4]` | `[1, 7, 7, 7]` |

`{type:'dog', age: _ }` | Any dict with `type: "dog"` and with an age | `{type:"dog", age: 3}` | `3` | `{type:"cat", age:2}` |

`{type:'dog', age: Number }` | Any dict with `type: "dog"` and with an numeric age | `{type:"dog", age: 3}` | `3` | `{type:"dog", age:2.3}` |

`x => x > 3` | Anything greather than 3 | `5` | `3` | `2` |

`null` | only `null` | `null` | nothing | any other value |

`undefined` | only `undefined` | `undefined` | nothing | any other value |

`npm install pampy`

- package on npmhttps://npmjs.com/package/pampy
- homepagehttps://github.com/santinic/pampy.js
- licenseMIT

RunKit is a free, in-browser JavaScript dev environment for prototyping **Node.js** code, with every **npm** package installed. Sign up to share your code.

Sign Up for Free