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;