00001 var baseWrapperValue = require('./_baseWrapperValue'),
00002 getView = require('./_getView'),
00003 isArray = require('./isArray');
00004
00006 var LAZY_FILTER_FLAG = 1,
00007 LAZY_MAP_FLAG = 2;
00008
00009
00010 var nativeMin = Math.min;
00011
00020 function lazyValue() {
00021 var array = this.__wrapped__.value(),
00022 dir = this.__dir__,
00023 isArr = isArray(array),
00024 isRight = dir < 0,
00025 arrLength = isArr ? array.length : 0,
00026 view = getView(0, arrLength, this.__views__),
00027 start = view.start,
00028 end = view.end,
00029 length = end - start,
00030 index = isRight ? end : (start - 1),
00031 iteratees = this.__iteratees__,
00032 iterLength = iteratees.length,
00033 resIndex = 0,
00034 takeCount = nativeMin(length, this.__takeCount__);
00035
00036 if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
00037 return baseWrapperValue(array, this.__actions__);
00038 }
00039 var result = [];
00040
00041 outer:
00042 while (length-- && resIndex < takeCount) {
00043 index += dir;
00044
00045 var iterIndex = -1,
00046 value = array[index];
00047
00048 while (++iterIndex < iterLength) {
00049 var data = iteratees[iterIndex],
00050 iteratee = data.iteratee,
00051 type = data.type,
00052 computed = iteratee(value);
00053
00054 if (type == LAZY_MAP_FLAG) {
00055 value = computed;
00056 } else if (!computed) {
00057 if (type == LAZY_FILTER_FLAG) {
00058 continue outer;
00059 } else {
00060 break outer;
00061 }
00062 }
00063 }
00064 result[resIndex++] = value;
00065 }
00066 return result;
00067 }
00068
00069 module.exports = lazyValue;