New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

pampy

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

pampy

Pattern Matching library for functional programming in JavaScript

  • 0.0.6
  • latest
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
69
decreased by-62.09%
Maintainers
1
Weekly downloads
 
Created
Source

Pampy in Star Wars

Pampy.js: Pattern Matching for JavaScript

License MIT Travis-CI Status Coverage Status npm version

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.

You can write many patterns

Patterns are evaluated in the order they appear.

You can write Fibonacci

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)
    );
}

You can write a Lisp calculator in 5 lines

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

You can match so many things!

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"
)

You can match TAIL

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])

You can nest lists and tuples

let {match, _, TAIL} = require("pampy");

x = [1, [2, 3], 4];

match(x, [1, [_, 3], _], (a, b) => [1, [a, 3], b]);   // => [1, [2, 3], 4]

You can nest dicts. And you can use _ as key!


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.

You can use functions as patterns

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

You can pass [pattern, action] array pairs to matchPairs for better Prettier formatting.

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

All the things you can match

Pattern ExampleWhat it meansMatched ExampleArguments Passed to functionNOT Matched Example
"hello"only the string "hello" matches"hello"nothingany other value
NumberAny javascript number2.352.35any other value
StringAny javascript string"hello""hello"any other value
ArrayAny array object[1, 2][1, 2]any other value
_Any objectthat value
ANYThe 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 > 3Anything greather than 3532
nullonly nullnullnothingany other value
undefinedonly undefinedundefinednothingany other value

How to install

npm install pampy

Keywords

FAQs

Package last updated on 17 Dec 2018

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc