whole

import _curry2 from '../_internals/_curry2.js'
import keys from './keys.js'

/**
 * @name whole
 * @function
 * @since v0.1.0
 * @category Object
 * @sig Object k (v -> Boolean) -> Object -> Boolean
 * @description Takes a schema of functions to apply to an object, and makes sure all of them pass
 * @param {Object} schema An Object schema containing the matching properties and the function to run
 * @param {Object} obj The object to iterate through
 * @return {Boolean} A boolean dependent on whether or not all values passed
 *
 * @example
 * import { whole } from 'kyanite'
 *
 * const run = whole({ a: x => x === 'foo', b: x => x !== 'bar', x: x => x > 10, y: x => x < 20 })
 *
 * run({ a: 'foo', b: 'xxx', x: 11, y: 19 }) // => true
 * run({ a: 'xxx', b: 'xxx', x: 11, y: 19 }) // => false
 */
const whole = (schema, obj) =>
  keys(schema).every(key =>
    schema[key](obj[key]))

export default _curry2(whole)