text: import arrayMap from 'lodash/_arrayMap';
  import isArrayLike from 'lodash/isArrayLike';
  import property from 'lodash/_baseProperty';
  import noop from 'lodash/noop';
  
  import wrapAsync from './wrapAsync';
  
  function filterArray(eachfn, arr, iteratee, callback) {
      var truthValues = new Array(arr.length);
      eachfn(arr, function (x, index, callback) {
          iteratee(x, function (err, v) {
              truthValues[index] = !!v;
              callback(err);
          });
      }, function (err) {
          if (err) return callback(err);
          var results = [];
          for (var i = 0; i < arr.length; i++) {
              if (truthValues[i]) results.push(arr[i]);
          }
          callback(null, results);
      });
  }
  
  function filterGeneric(eachfn, coll, iteratee, callback) {
      var results = [];
      eachfn(coll, function (x, index, callback) {
          iteratee(x, function (err, v) {
              if (err) {
                  callback(err);
              } else {
                  if (v) {
                      results.push({index: index, value: x});
                  }
                  callback();
              }
          });
      }, function (err) {
          if (err) {
              callback(err);
          } else {
              callback(null, arrayMap(results.sort(function (a, b) {
                  return a.index - b.index;
              }), property('value')));
          }
      });
  }
  
  export default function _filter(eachfn, coll, iteratee, callback) {
      var filter = isArrayLike(coll) ? filterArray : filterGeneric;
      filter(eachfn, coll, wrapAsync(iteratee), callback || noop);
  }
  