| var baseWrapperValue = require('./_baseWrapperValue'), |
| getView = require('./_getView'), |
| isArray = require('./isArray'); |
| |
| /** Used to indicate the type of lazy iteratees. */ |
| var LAZY_FILTER_FLAG = 1, |
| LAZY_MAP_FLAG = 2; |
| |
| /* Built-in method references for those with the same name as other `lodash` methods. */ |
| var nativeMin = Math.min; |
| |
| /** |
| * Extracts the unwrapped value from its lazy wrapper. |
| * |
| * @private |
| * @name value |
| * @memberOf LazyWrapper |
| * @returns {*} Returns the unwrapped value. |
| */ |
| function lazyValue() { |
| var array = this.__wrapped__.value(), |
| dir = this.__dir__, |
| isArr = isArray(array), |
| isRight = dir < 0, |
| arrLength = isArr ? array.length : 0, |
| view = getView(0, arrLength, this.__views__), |
| start = view.start, |
| end = view.end, |
| length = end - start, |
| index = isRight ? end : (start - 1), |
| iteratees = this.__iteratees__, |
| iterLength = iteratees.length, |
| resIndex = 0, |
| takeCount = nativeMin(length, this.__takeCount__); |
| |
| if (!isArr || (!isRight && arrLength == length && takeCount == length)) { |
| return baseWrapperValue(array, this.__actions__); |
| } |
| var result = []; |
| |
| outer: |
| while (length-- && resIndex < takeCount) { |
| index += dir; |
| |
| var iterIndex = -1, |
| value = array[index]; |
| |
| while (++iterIndex < iterLength) { |
| var data = iteratees[iterIndex], |
| iteratee = data.iteratee, |
| type = data.type, |
| computed = iteratee(value); |
| |
| if (type == LAZY_MAP_FLAG) { |
| value = computed; |
| } else if (!computed) { |
| if (type == LAZY_FILTER_FLAG) { |
| continue outer; |
| } else { |
| break outer; |
| } |
| } |
| } |
| result[resIndex++] = value; |
| } |
| return result; |
| } |
| |
| module.exports = lazyValue; |