Replace lodash curry with our own

lodash's curry is great and does a lot, but we don't need it all. This
is quite a bit faster.

Currently, it does away with placeholder support.

updeep curry partial call x 9,951,410 ops/sec ±1.61% (62 runs sampled)
lodash curry partial call x 988,949 ops/sec ±1.36% (62 runs sampled)
This commit is contained in:
Aaron Jensen 2015-08-11 23:53:05 -07:00
parent ff195645cd
commit 3ce001a4f6
8 changed files with 35 additions and 8 deletions

6
lib/if.js Normal file
View File

@ -0,0 +1,6 @@
import ifElse from './ifElse';
import curry from './util/curry';
export default curry((predicate, trueUpdates, object) =>
ifElse(predicate, trueUpdates, {}, object)
);

View File

@ -1,5 +1,6 @@
import freeze from './freeze'; import freeze from './freeze';
import is from './is'; import is from './is';
import _if from './if';
import ifElse from './ifElse'; import ifElse from './ifElse';
import map from './map'; import map from './map';
import omit from './omit'; import omit from './omit';
@ -8,11 +9,9 @@ import update from './update';
import updateIn from './updateIn'; import updateIn from './updateIn';
import withDefault from './withDefault'; import withDefault from './withDefault';
import { placeholder as _ } from 'lodash/function/curry';
const u = update; const u = update;
u.if = ifElse(_, _, {}); u.if = _if;
u.ifElse = ifElse; u.ifElse = ifElse;
u.is = is; u.is = is;
u.freeze = freeze; u.freeze = freeze;

View File

@ -1,5 +1,5 @@
import splitPath from './util/splitPath'; import splitPath from './util/splitPath';
import curry from 'lodash/function/curry'; import curry from './util/curry';
function is(path, predicate, object) { function is(path, predicate, object) {
const parts = splitPath(path); const parts = splitPath(path);

View File

@ -75,4 +75,4 @@ function update(updates, object, ...args) {
return { ...object, ...resolvedUpdates }; return { ...object, ...resolvedUpdates };
} }
export default wrap(update); export default wrap(update, 2);

View File

@ -1,4 +1,4 @@
import curry from 'lodash/function/curry'; import curry from './util/curry';
import update from './update'; import update from './update';
import splitPath from './util/splitPath'; import splitPath from './util/splitPath';

View File

@ -28,3 +28,25 @@ export function curry3(fn) {
return curried; return curried;
}; };
} }
export function curry4(fn) {
return function curried(a, b, c, d, e, f) {
const n = arguments.length;
if (n >= 4) return fn(a, b, c, d, e, f);
if (n === 3) return curry1((d, e, f) => fn(a, b, c, d, e, f));
if (n === 2) return curry2((c, d, e, f) => fn(a, b, c, d, e, f));
if (n === 1) return curry3((b, c, d, e, f) => fn(a, b, c, d, e, f));
return curried;
};
}
export default function curry(fn, length = fn.length) {
return [
fn,
curry1,
curry2,
curry3,
curry4,
][length](fn);
}

View File

@ -1,5 +1,5 @@
import update from './update'; import update from './update';
import curry from 'lodash/function/curry'; import curry from './util/curry';
function withDefault(defaultValue, updates, object) { function withDefault(defaultValue, updates, object) {
if (typeof object === 'undefined') { if (typeof object === 'undefined') {

View File

@ -1,4 +1,4 @@
import curry from 'lodash/function/curry'; import curry from './util/curry';
import freeze from './freeze'; import freeze from './freeze';
export default function wrap(func, length = func.length) { export default function wrap(func, length = func.length) {