kensho/check-more-types

View on GitHub
src/logic.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict'

var low = require('./low-level')

/**
  Combines multiple predicate functions to produce new OR predicate
  @method or
*/
function or () {
  var predicates = Array.prototype.slice.call(arguments, 0)
  if (!predicates.length) {
    throw new Error('empty list of arguments to or')
  }

  return function orCheck () {
    var values = Array.prototype.slice.call(arguments, 0)
    return predicates.some(function (predicate) {
      try {
        return low.fn(predicate) ? predicate.apply(null, values) : Boolean(predicate)
      } catch (err) {
        // treat exceptions as false
        return false
      }
    })
  }
}

/**
  Combines multiple predicate functions to produce new AND predicate
  @method or
*/
function and () {
  var predicates = Array.prototype.slice.call(arguments, 0)
  if (!predicates.length) {
    throw new Error('empty list of arguments to or')
  }

  return function orCheck () {
    var values = Array.prototype.slice.call(arguments, 0)
    return predicates.every(function (predicate) {
      return low.fn(predicate) ? predicate.apply(null, values) : Boolean(predicate)
    })
  }
}

/**
* Public modifier `not`.
*
* Negates `predicate`.
* copied from check-types.js
*/
function notModifier (predicate) {
  return function () {
    return !predicate.apply(null, arguments)
  }
}

function every (predicateResults) {
  var property, value
  for (property in predicateResults) {
    if (predicateResults.hasOwnProperty(property)) {
      value = predicateResults[property]

      if (low.object(value) && every(value) === false) {
        return false
      }

      if (value === false) {
        return false
      }
    }
  }
  return true
}

function map (things, predicates) {
  var property
  var result = {}
  var predicate
  for (property in predicates) {
    if (predicates.hasOwnProperty(property)) {
      predicate = predicates[property]

      if (low.fn(predicate)) {
        result[property] = predicate(things[property])
      } else if (low.object(predicate)) {
        result[property] = map(things[property], predicate)
      }
    }
  }

  return result
}

module.exports = {
  or: or,
  and: and,
  notModifier: notModifier,
  every: every,
  map: map
}