Skip to content

Commit b05a101

Browse files
committed
Update buildMatch function to be more efficient
1 parent eb96f51 commit b05a101

5 files changed

Lines changed: 74 additions & 89 deletions

File tree

.babelrc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
{
66
"targets": {
77
"node": "current"
8-
},
9-
"modules": false,
10-
"loose": true
8+
}
119
}
1210
]
1311
]

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"name": "tailored",
3-
"version": "2.4.3",
3+
"version": "2.4.4",
44
"description": "Pattern matching library",
55
"main": "lib/tailored.js",
66
"jsnext:main": "src/index.js",
77
"scripts": {
88
"build": "rollup -c rollup.config.js",
9-
"test": "mocha test --recursive --compilers js:babel-core/register"
9+
"test": "mocha test --recursive --compilers js:babel-register"
1010
},
1111
"keywords": [
1212
"pattern-matching",
@@ -21,13 +21,13 @@
2121
"devDependencies": {
2222
"babel-core": "^6.24.0",
2323
"babel-preset-env": "^1.3.2",
24+
"babel-register": "^6.24.0",
2425
"chai": "^3.5.0",
2526
"mocha": "^3.2.0",
2627
"rollup": "^0.41.0",
2728
"rollup-plugin-babel": "^2.7.1"
2829
},
2930
"dependencies": {
30-
"erlang-types": "^1.0.0",
31-
"tailored": "^2.4.2"
31+
"erlang-types": "^1.0.0"
3232
}
3333
}

src/tailored/checks.js

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
/* @flow */
22

3-
import { Variable, Wildcard, HeadTail, Capture, Type, StartsWith, Bound, BitStringMatch } from "./types";
3+
import {
4+
Variable,
5+
Wildcard,
6+
HeadTail,
7+
Capture,
8+
Type,
9+
StartsWith,
10+
Bound,
11+
BitStringMatch,
12+
} from './types';
413

514
function is_number(value) {
615
return typeof value === 'number';
716
}
817

9-
function is_string(value){
18+
function is_string(value) {
1019
return typeof value === 'string';
1120
}
1221

@@ -18,16 +27,12 @@ function is_symbol(value) {
1827
return typeof value === 'symbol';
1928
}
2029

21-
function is_null(value) {
22-
return value === null;
23-
}
24-
2530
function is_undefined(value) {
2631
return typeof value === 'undefined';
2732
}
2833

29-
function is_function(value) {
30-
return Object.prototype.toString.call(value) == '[object Function]';
34+
function is_object(value) {
35+
return typeof value === 'object';
3136
}
3237

3338
function is_variable(value) {
@@ -58,16 +63,20 @@ function is_bound(value) {
5863
return value instanceof Bound;
5964
}
6065

61-
function is_object(value) {
62-
return typeof value === 'object';
66+
function is_bitstring(value) {
67+
return value instanceof BitStringMatch;
68+
}
69+
70+
function is_null(value) {
71+
return value === null;
6372
}
6473

6574
function is_array(value) {
6675
return Array.isArray(value);
6776
}
6877

69-
function is_bitstring(value) {
70-
return value instanceof BitStringMatch;
78+
function is_function(value) {
79+
return Object.prototype.toString.call(value) == '[object Function]';
7180
}
7281

7382
export {
@@ -87,5 +96,5 @@ export {
8796
is_bound,
8897
is_object,
8998
is_array,
90-
is_bitstring
99+
is_bitstring,
91100
};

src/tailored/match.js

Lines changed: 34 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,45 @@
1-
/* @flow */
2-
import * as Checks from "./checks";
3-
import * as Resolvers from "./resolvers";
1+
import * as Resolvers from './resolvers';
2+
import {
3+
Variable,
4+
Wildcard,
5+
HeadTail,
6+
Capture,
7+
Type,
8+
StartsWith,
9+
Bound,
10+
BitStringMatch,
11+
} from './types';
12+
13+
const patternMap = new Map();
14+
patternMap.set(Variable.prototype, Resolvers.resolveVariable);
15+
patternMap.set(Wildcard.prototype, Resolvers.resolveWildcard);
16+
patternMap.set(HeadTail.prototype, Resolvers.resolveHeadTail);
17+
patternMap.set(StartsWith.prototype, Resolvers.resolveStartsWith);
18+
patternMap.set(Capture.prototype, Resolvers.resolveCapture);
19+
patternMap.set(Bound.prototype, Resolvers.resolveBound);
20+
patternMap.set(Type.prototype, Resolvers.resolveType);
21+
patternMap.set(BitStringMatch.prototype, Resolvers.resolveBitString);
22+
patternMap.set(Number.prototype, Resolvers.resolveNumber);
23+
patternMap.set(Symbol.prototype, Resolvers.resolveSymbol);
24+
patternMap.set(Array.prototype, Resolvers.resolveArray);
25+
patternMap.set(String.prototype, Resolvers.resolveString);
26+
patternMap.set(Boolean.prototype, Resolvers.resolveBoolean);
27+
patternMap.set(Object.prototype, Resolvers.resolveObject);
428

529
export function buildMatch(pattern) {
6-
7-
if(Checks.is_variable(pattern)){
8-
return Resolvers.resolveVariable(pattern);
9-
}
10-
11-
if(Checks.is_wildcard(pattern)){
12-
return Resolvers.resolveWildcard(pattern);
30+
if (pattern === null) {
31+
return Resolvers.resolveNull(pattern);
1332
}
1433

15-
if(Checks.is_undefined(pattern)){
34+
if (typeof pattern === 'undefined') {
1635
return Resolvers.resolveWildcard(pattern);
1736
}
1837

19-
if(Checks.is_headTail(pattern)){
20-
return Resolvers.resolveHeadTail(pattern);
21-
}
22-
23-
if(Checks.is_startsWith(pattern)){
24-
return Resolvers.resolveStartsWith(pattern);
25-
}
26-
27-
if(Checks.is_capture(pattern)){
28-
return Resolvers.resolveCapture(pattern);
29-
}
30-
31-
if(Checks.is_bound(pattern)){
32-
return Resolvers.resolveBound(pattern);
33-
}
34-
35-
if(Checks.is_type(pattern)){
36-
return Resolvers.resolveType(pattern);
37-
}
38-
39-
if(Checks.is_array(pattern)){
40-
return Resolvers.resolveArray(pattern);
41-
}
42-
43-
if(Checks.is_number(pattern)){
44-
return Resolvers.resolveNumber(pattern);
45-
}
46-
47-
if(Checks.is_string(pattern)){
48-
return Resolvers.resolveString(pattern);
49-
}
50-
51-
if(Checks.is_boolean(pattern)){
52-
return Resolvers.resolveBoolean(pattern);
53-
}
54-
55-
if(Checks.is_symbol(pattern)){
56-
return Resolvers.resolveSymbol(pattern);
57-
}
58-
59-
if(Checks.is_null(pattern)){
60-
return Resolvers.resolveNull(pattern);
61-
}
62-
63-
if(Checks.is_bitstring(pattern)){
64-
return Resolvers.resolveBitString(pattern);
65-
}
38+
const type = pattern.constructor.prototype;
39+
const resolver = patternMap.get(type);
6640

67-
if(Checks.is_object(pattern)){
68-
return Resolvers.resolveObject(pattern);
41+
if (resolver) {
42+
return resolver(pattern);
6943
}
7044

7145
return Resolvers.resolveNoMatch();

yarn.lock

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,8 @@ browserslist@^1.4.0:
494494
electron-to-chromium "^1.2.7"
495495

496496
caniuse-db@^1.0.30000639:
497-
version "1.0.30000646"
498-
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000646.tgz#c724b90d61df24286e015fc528d062073c00def4"
497+
version "1.0.30000649"
498+
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000649.tgz#1ee1754a6df235450c8b7cd15e0ebf507221a86a"
499499

500500
chai@^3.5.0:
501501
version "3.5.0"
@@ -533,12 +533,18 @@ core-js@^2.4.0:
533533
version "2.4.1"
534534
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e"
535535

536-
debug@2.2.0, debug@^2.1.1, debug@^2.2.0:
536+
debug@2.2.0:
537537
version "2.2.0"
538538
resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
539539
dependencies:
540540
ms "0.7.1"
541541

542+
debug@^2.1.1, debug@^2.2.0:
543+
version "2.6.3"
544+
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d"
545+
dependencies:
546+
ms "0.7.2"
547+
542548
deep-eql@^0.1.3:
543549
version "0.1.3"
544550
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2"
@@ -755,6 +761,10 @@ ms@0.7.1:
755761
version "0.7.1"
756762
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
757763

764+
ms@0.7.2:
765+
version "0.7.2"
766+
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
767+
758768
number-is-nan@^1.0.0:
759769
version "1.0.1"
760770
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -877,12 +887,6 @@ supports-color@^2.0.0:
877887
version "2.0.0"
878888
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
879889

880-
tailored@^2.4.2:
881-
version "2.4.2"
882-
resolved "https://registry.yarnpkg.com/tailored/-/tailored-2.4.2.tgz#c2d9eb40d23f4b660791cf5f5b0ca997e5aa5171"
883-
dependencies:
884-
erlang-types "^1.0.0"
885-
886890
to-fast-properties@^1.0.1:
887891
version "1.0.2"
888892
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320"

0 commit comments

Comments
 (0)