1.2.2 • Published 5 years ago

@mkrause/match v1.2.2

Weekly downloads
18
License
MIT
Repository
github
Last release
5 years ago

match.js

JavaScript matching utility. Allows you to branch on a value using a list of different possible cases.

Usage

The match function takes a value, and a list of cases, and returns either the first case that matches, or an exception otherwise.

    import match from '@mkrause/match'; // If using ES6 modules
    const { match } = require('@mkrause/match'); // If using ES5
    
    match(<value>, <case-list>);

The case list can be specified in one of two ways. If the value is a string (or if we're using a custom matcher, see below) then we can use an object where the value is matched against each property name.

    const result = match('foo', {
        foo: 42,
        bar: 43,
    });
    result === 42;

Alternatively, we can specify a list of predicates (functions) using match.case(<predicate>, <result>). Each predicate is given the value and should return a boolean indicating whether there is a match.

    const result = match({ position: 42 }, [
        match.case(x => x.position > 0, +1),
        match.case(x => x.position == 0, 0),
        match.case(x => x.position < 0, -1),
    ]);
    result === 1;

A case result can be either a plain value, or a function:

    const result = match('apple', {
        apple: () => processApple(),
        orange: () => processOrange(),
    });

A default case can be specified as fallback. With an object as case list, a special symbol match.default is available which can be used as unambiguous property name. With a case list, use match.otherwise.

    const result = match('pear', {
        apple: () => processApple(),
        orange: () => processOrange(),
        [match.default]: fruitType => processOther(fruitType),
    });
    
    const result = match({ color: 'yellow' }, [
        match.case(({ color }) => color === 'red', 0xff0000),
        match.case(({ color }) => color === 'green', 0x00ff00),
        match.case(({ color }) => color === 'blue', 0x0000ff),
        match.otherwise('unknown color!'),
    ]);

If no case matches, and no fallback is given, an exception is thrown.

Custom match semantics

You can create your own custom match function. For example, let's say our React/Redux/Flux application makes use of actions that conform to the Flux Standard Action (FSA) protocol. We could create a matcher as follows:

    import { matcher } from '@mkrause/match';
    
    const match = matcher(subject => {
        return { discriminator: subject.type, body: subject };
    });
    
    const action = { type: 'CREATE_USER', error: false, payload: { name: 'John' } };
    const result = match(action, {
        CREATE_USER: ({ error, payload }) => doSomethingWith(payload),
    });

We supply a couple of common matchers out of the box:

  • match: generic matcher
  • matchType: match on objects with a type property
  • matchSingleKey: match on objects with a single property, e.g. { MY_TYPE: { value: 42 } }
    import { matchType, matchSingleKey } from '@mkrause/match';
    
    const action = { type: 'CREATE_USER', error: false, payload: { name: 'John' } };
    matchType(action, {
        CREATE_USER: ({ error, payload }) => doSomethingWith(payload),
    });
    
    matchSingleKey({ CREATE_USER: { name: 'John' } }, {
        CREATE_USER: user => doSomethingWith(user),
    });

Similar libraries

1.2.2

5 years ago

1.2.1

5 years ago

1.2.0

5 years ago

1.1.2

5 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.20

7 years ago

1.0.19

7 years ago

1.0.18

7 years ago

1.0.17

7 years ago

1.0.16

7 years ago

1.0.15

7 years ago

1.0.12

7 years ago

1.0.11

7 years ago

1.0.10

7 years ago

1.0.9

7 years ago

1.0.8

7 years ago

1.0.7

7 years ago

1.0.6

7 years ago

1.0.5

7 years ago

1.0.4

7 years ago

1.0.3

7 years ago

1.0.2

7 years ago

1.0.1

7 years ago

1.0.0

7 years ago