lib/index.js
function mapRun(input, schema, discrepencies) {
  var result = {};
  _.forOwn(schema, function (value, key) {
    if (_.isPlainObject(value)) {
      // Recursive. Others are bases.
      result[key] = mapRun(input[key], value, discrepencies);
    } else if (_.isArray(value)) {
      try {
        result[key] = value.reduce(function (prev, curr, index) {
          if (!_.isFunction(curr)) throw 'Index [' + index + ']: Not a function.';
          return curr(prev);
        }, input[key]);
      } catch (e) {
        discrepencies.push('' + key + ': ' + e);
      }
    } else if (_.isFunction(value)) {
      try {
        result[key] = value(input[key]); // Result of running that function against the input.
      } catch (e) {
        discrepencies.push('' + key + ': ' + e);
      }
    } else {
      throw new TypeError('Schemas should be a nested object of functions or function arrays.');
    }
  });
  return result;
}
function mapRun(input, schema, discrepencies) {
  var result = {};
  _.forOwn(schema, function (value, key) {
    if (_.isPlainObject(value)) {
      // Recursive. Others are bases.
      result[key] = mapRun(input[key], value, discrepencies);
    } else if (_.isArray(value)) {
      try {
        result[key] = value.reduce(function (prev, curr, index) {
          if (!_.isFunction(curr)) throw 'Index [' + index + ']: Not a function.';
          return curr(prev);
        }, input[key]);
      } catch (e) {
        discrepencies.push('' + key + ': ' + e);
      }
    } else if (_.isFunction(value)) {
      try {
        result[key] = value(input[key]); // Result of running that function against the input.
      } catch (e) {
        discrepencies.push('' + key + ': ' + e);
      }
    } else {
      throw new TypeError('Schemas should be a nested object of functions or function arrays.');
    }
  });
  return result;
}
Returns a result map of running the schema's tests/transformers against an input object.