mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-02 08:07:50 +00:00
Simplify lazy chaining by removing support for dropWhile and dropRightWhile.
This commit is contained in:
104
lodash.src.js
104
lodash.src.js
@@ -37,8 +37,7 @@
|
||||
var LARGE_ARRAY_SIZE = 200;
|
||||
|
||||
/** Used to indicate the type of lazy iteratees. */
|
||||
var LAZY_DROP_WHILE_FLAG = 0,
|
||||
LAZY_FILTER_FLAG = 1,
|
||||
var LAZY_FILTER_FLAG = 1,
|
||||
LAZY_MAP_FLAG = 2;
|
||||
|
||||
/** Used as the `TypeError` message for "Functions" methods. */
|
||||
@@ -1111,7 +1110,6 @@
|
||||
this.__wrapped__ = value;
|
||||
this.__actions__ = [];
|
||||
this.__dir__ = 1;
|
||||
this.__dropCount__ = 0;
|
||||
this.__filtered__ = false;
|
||||
this.__iteratees__ = [];
|
||||
this.__takeCount__ = POSITIVE_INFINITY;
|
||||
@@ -1196,30 +1194,16 @@
|
||||
while (++iterIndex < iterLength) {
|
||||
var data = iteratees[iterIndex],
|
||||
iteratee = data.iteratee,
|
||||
type = data.type;
|
||||
type = data.type,
|
||||
computed = iteratee(value);
|
||||
|
||||
if (type == LAZY_DROP_WHILE_FLAG) {
|
||||
if (data.done && (isRight ? (index > data.index) : (index < data.index))) {
|
||||
data.count = 0;
|
||||
data.done = false;
|
||||
}
|
||||
data.index = index;
|
||||
if (!data.done) {
|
||||
var limit = data.limit;
|
||||
if (!(data.done = limit > -1 ? (data.count++ >= limit) : !iteratee(value))) {
|
||||
continue outer;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var computed = iteratee(value);
|
||||
if (type == LAZY_MAP_FLAG) {
|
||||
value = computed;
|
||||
} else if (!computed) {
|
||||
if (type == LAZY_FILTER_FLAG) {
|
||||
continue outer;
|
||||
} else {
|
||||
break outer;
|
||||
}
|
||||
if (type == LAZY_MAP_FLAG) {
|
||||
value = computed;
|
||||
} else if (!computed) {
|
||||
if (type == LAZY_FILTER_FLAG) {
|
||||
continue outer;
|
||||
} else {
|
||||
break outer;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12177,44 +12161,18 @@
|
||||
lodash[methodName].placeholder = lodash;
|
||||
});
|
||||
|
||||
// Add `LazyWrapper` methods that accept an `iteratee` value.
|
||||
arrayEach(['dropWhile', 'filter', 'map', 'takeWhile'], function(methodName, type) {
|
||||
var isFilter = type != LAZY_MAP_FLAG,
|
||||
isDropWhile = type == LAZY_DROP_WHILE_FLAG;
|
||||
|
||||
LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
|
||||
var filtered = this.__filtered__,
|
||||
result = (filtered && isDropWhile) ? new LazyWrapper(this) : this.clone();
|
||||
|
||||
result.__iteratees__.push({
|
||||
'done': false,
|
||||
'count': 0,
|
||||
'index': 0,
|
||||
'iteratee': getCallback(iteratee, thisArg, 1),
|
||||
'limit': -1,
|
||||
'type': type
|
||||
});
|
||||
|
||||
result.__filtered__ = filtered || isFilter;
|
||||
return result;
|
||||
};
|
||||
});
|
||||
|
||||
// Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
|
||||
arrayEach(['drop', 'take'], function(methodName, index) {
|
||||
var whileName = methodName + 'While';
|
||||
|
||||
LazyWrapper.prototype[methodName] = function(n) {
|
||||
var filtered = this.__filtered__,
|
||||
result = (filtered && !index) ? this.dropWhile() : this.clone();
|
||||
|
||||
var filtered = this.__filtered__;
|
||||
if (filtered && !index) {
|
||||
return new LazyWrapper(this);
|
||||
}
|
||||
n = n == null ? 1 : nativeMax(floor(n) || 0, 0);
|
||||
|
||||
var result = this.clone();
|
||||
if (filtered) {
|
||||
if (index) {
|
||||
result.__takeCount__ = nativeMin(result.__takeCount__, n);
|
||||
} else {
|
||||
last(result.__iteratees__).limit = n;
|
||||
}
|
||||
result.__takeCount__ = nativeMin(result.__takeCount__, n);
|
||||
} else {
|
||||
result.__views__.push({ 'size': n, 'type': methodName + (result.__dir__ < 0 ? 'Right' : '') });
|
||||
}
|
||||
@@ -12224,9 +12182,18 @@
|
||||
LazyWrapper.prototype[methodName + 'Right'] = function(n) {
|
||||
return this.reverse()[methodName](n).reverse();
|
||||
};
|
||||
});
|
||||
|
||||
LazyWrapper.prototype[methodName + 'RightWhile'] = function(predicate, thisArg) {
|
||||
return this.reverse()[whileName](predicate, thisArg).reverse();
|
||||
// Add `LazyWrapper` methods that accept an `iteratee` value.
|
||||
arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
|
||||
var type = index + 1,
|
||||
isFilter = type != LAZY_MAP_FLAG;
|
||||
|
||||
LazyWrapper.prototype[methodName] = function(iteratee, thisArg) {
|
||||
var result = this.clone();
|
||||
result.__iteratees__.push({ 'iteratee': getCallback(iteratee, thisArg, 1), 'type': type });
|
||||
result.__filtered__ = result.__filtered__ || isFilter;
|
||||
return result;
|
||||
};
|
||||
});
|
||||
|
||||
@@ -12244,7 +12211,7 @@
|
||||
var dropName = 'drop' + (index ? '' : 'Right');
|
||||
|
||||
LazyWrapper.prototype[methodName] = function() {
|
||||
return this[dropName](1);
|
||||
return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
|
||||
};
|
||||
});
|
||||
|
||||
@@ -12273,10 +12240,13 @@
|
||||
start = start == null ? 0 : (+start || 0);
|
||||
|
||||
var result = this;
|
||||
if (result.__filtered__ && (start > 0 || end < 0)) {
|
||||
return new LazyWrapper(result);
|
||||
}
|
||||
if (start < 0) {
|
||||
result = this.takeRight(-start);
|
||||
result = result.takeRight(-start);
|
||||
} else if (start) {
|
||||
result = this.drop(start);
|
||||
result = result.drop(start);
|
||||
}
|
||||
if (end !== undefined) {
|
||||
end = (+end || 0);
|
||||
@@ -12285,8 +12255,12 @@
|
||||
return result;
|
||||
};
|
||||
|
||||
LazyWrapper.prototype.takeRightWhile = function(predicate, thisArg) {
|
||||
return this.reverse().takeWhile(predicate, thisArg).reverse();
|
||||
};
|
||||
|
||||
LazyWrapper.prototype.toArray = function() {
|
||||
return this.drop(0);
|
||||
return this.take(POSITIVE_INFINITY);
|
||||
};
|
||||
|
||||
// Add `LazyWrapper` methods to `lodash.prototype`.
|
||||
|
||||
Reference in New Issue
Block a user