a(name='predicates')
h1 Predicates
hr
.panel.panel-default
  a(name='not')
  .panel-heading
    h4 not
      small: code predicate.not

  .panel-body
    :markdown
      A complemented version of the `predicate` predicate functions.
      All predicate functions are available in this namespace.
    hr
    p
      small Example
      :markdown
        ```js
        predicate.null(null) // true
        predicate.not.null(null) // false
        ```
.panel.panel-default
  a(name='is')
  .panel-heading
    h4 is
      small: code predicate.is(a, b)

  .panel-body
    :markdown
      Returns true if `Object.is(a, b)`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.is(window, window) // true
        predicate.is(1, 1) // true
        predicate.is(NaN, 0/0) // true
        predicate.is(0, -0) // false
        predicate.is([], []) // false
        ```
.panel.panel-default
  a(name='exists')
  .panel-heading
    h4 exists
      small: code predicate.exists(val)

  .panel-body
    :markdown
      Returns true if a value is not `null` or `undefined`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.exists(null) // false
        predicate.exists(false) // true
        predicate.exists(0) // true
        predicate.exists('javascript') // true
        ```
.panel.panel-default
  a(name='truthy')
  .panel-heading
    h4 truthy
      small: code predicate.truthy(val)

  .panel-body
    :markdown
      Returns true if a value `exists` and isn't `false`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.truthy(0) // true
        predicate.truthy([1, 2]) // true
        predicate.truthy(false) // false
        predicate.truthy(null) // false
        ```
.panel.panel-default
  a(name='falsey')
  .panel-heading
    h4 falsey
      small: code predicate.falsey(val)

  .panel-body
    :markdown
      Returns true if a value is `false` or `doesn't exist`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.falsey(0) // false
        predicate.falsey([1, 2]) // false
        predicate.falsey(false) // true
        predicate.falsey(null) // true
        ```
.panel.panel-default
  a(name='null')
  .panel-heading
    h4 null
      small: code predicate.null(val)

  .panel-body
    :markdown
      Returns true if a value is `null`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.null(null) // true
        predicate.null(false) // false
        predicate.null(undefined) // false
        ```
.panel.panel-default
  a(name='undef')
  .panel-heading
    h4 undef
      small: code predicate.undef(val)

  .panel-body
    :markdown
      Returns true if a value is `undefined`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.undef(undefined) // true
        predicate.undef(null) // false
        predicate.undef(false) // false
        ```
.panel.panel-default
  a(name='equal')
  .panel-heading
    h4 equal
      small: code predicate.equal(a, b)


  .panel-body
    :markdown
      Returns true if `a === b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.equal(1, 1) // true
        predicate.equal('a', 'a') // true
        predicate.equal(null, 1) // false
        predicate.equal([1, 2], [1, 2]) // false
        ```
.panel.panel-default
  a(name='eq')
  .panel-heading
    h4 eq
      small: code predicate.eq(a, b)

  .panel-body
    :markdown
      Returns true if `a == b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.eq('1', 1) // true
        predicate.eq('a', 'b') // false
        ```
.panel.panel-default
  a(name='less')
  .panel-heading
    h4 less
      small: code predicate.less(a, b)
    small alias
      code predicate.lt(a, b)

  .panel-body
    :markdown
      Returns true if `a < b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.less(1, 5) // true
        predicate.less(5, 5) // false
        predicate.less(5, 1) // false
        ```
.panel.panel-default
  a(name='lessEq')
  .panel-heading
    h4 lessEq
      small: code predicate.lessEq(a, b)
    small alias
      code predicate.ltEq(a, b) predicate.le(a, b)

  .panel-body
    :markdown
      Returns true if `a <= b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.lessEq(1, 5) // true
        predicate.lessEq(5, 5) // true
        predicate.lessEq(5, 1) // false
        ```
.panel.panel-default
  a(name='greater')
  .panel-heading
    h4 greater
      small: code predicate.greater(a, b)
    small alias
      code predicate.gt(a, b)

  .panel-body
    :markdown
      Returns true if `a > b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.greater(5, 1) // true
        predicate.greater(5, 5) // false
        predicate.greater(1, 5) // false
        ```
.panel.panel-default
  a(name='greaterEq')
  .panel-heading
    h4 greaterEq
      small: code predicate.greaterEq(a, b)
    small alias
      code predicate.gtEq(a, b) predicate.ge(a, b)

  .panel-body
    :markdown
      Returns true if `a > b`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        predicate.greaterEq(5, 1) // true
        predicate.greaterEq(5, 5) // true
        predicate.greaterEq(1, 5) // false
        ```
.panel.panel-default
  a(name='object')
  .panel-heading
    h4 object
      small: code predicate.object(val)
    small alias
      code predicate.obj(val)

  .panel-body
    :markdown
      Returns true if `val` is an object
    hr
    p
      small Example
      :markdown
        ```js
        predicate.object({}) // true
        predicate.object([]) // true
        predicate.object(1) // false
        ```
.panel.panel-default
  a(name='array')
  .panel-heading
    h4 array
      small: code predicate.array(val)
    small alias
      code predicate.arr(val)

  .panel-body
    :markdown
      Returns true if `val` is an array

      *Defaults to native* `Array.isArray`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.array([]) // true
        predicate.array({}) // false
        predicate.array(1) // false
        ```
.panel.panel-default
  a(name='date')
  .panel-heading
    h4 date
      small: code predicate.date(val)

  .panel-body
    :markdown
      Returns true if `val` is a date
    hr
    p
      small Example
      :markdown
        ```js
        predicate.date(new Date()) // true
        predicate.date({}) // false
        predicate.date(1) // false
        ```
.panel.panel-default
  a(name='rgx')
  .panel-heading
    h4 rgx
      small: code predicate.rgx(val)
    small alias
      code predicate.RegExp(val) predicate.regexp(val) predicate.regex(val)

  .panel-body
    :markdown
      Returns true if `val` is a rgx
    hr
    p
      small Example
      :markdown
        ```js
        predicate.rgx(/\d{1,4}/) // true
        predicate.rgx(new RegExp("Cosmos", "gi")) // true
        predicate.rgx({}) // false
        predicate.rgx("Dark Star") // false
        ```

.panel.panel-default
  a(name='nan')
  .panel-heading
    h4 nan
      small: code predicate.nan(val)
    small alias
      code predicate.NaN(val)

  .panel-body
    :markdown
      Returns true if `val` is `NaN`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.nan(nan) // true
        predicate.nan("titan") // false
        predicate.nan(1) // false
        ```
.panel.panel-default
  a(name='arguments')
  .panel-heading
    h4 arguments
      small: code predicate.arguments(val)

  .panel-body
    :markdown
      Returns true if `val` is an `arguments` object
    hr
    p
      small Example
      :markdown
        ```js
        predicate.arguments(arguments) // true
        predicate.arguments("titan") // false
        ```
.panel.panel-default
  a(name='error')
  .panel-heading
    h4 error
      small: code predicate.error(val)

  .panel-body
    :markdown
      Returns true if `val` is an `error` object
    hr
    p
      small Example
      :markdown
        ```js
        predicate.error(new Error()) // true
        predicate.error("titan") // false
        ```
.panel.panel-default
  a(name='fn')
  .panel-heading
    h4 fn
      small: code predicate.fn(val)
    small alias
      code predicate.function(val)

  .panel-body
    :markdown
      Returns true if `typeof val === 'function'`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.fn(predicate.fn) // true
        predicate.fn(Math.max) // true
        predicate.fn({}) // false
        predicate.fn("Dark Star") // false
        ```
.panel.panel-default
  a(name='num')
  .panel-heading
    h4 num
      small: code predicate.num(val)
    small alias
      code predicate.number(val)

  .panel-body
    :markdown
      Returns true if `typeof val === 'number'`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.num(1) // true
        predicate.num(NaN) // false
        predicate.num({}) // false
        predicate.num("Dark Star") // false
        ```
.panel.panel-default
  a(name='str')
  .panel-heading
    h4 str
      small: code predicate.str(val)
    small alias
      code predicate.string(val)

  .panel-body
    :markdown
      Returns true if `typeof val === 'string'`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.str("Dark Star") // true
        predicate.str(1) // false
        predicate.str({}) // false
        ```
.panel.panel-default
  a(name='bool')
  .panel-heading
    h4 bool
      small: code predicate.bool(val)
    small alias
      code predicate.boolean(val)

  .panel-body
    :markdown
      Returns true if `typeof val === 'boolean'`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.bool(true) // false
        predicate.bool(false) // false
        predicate.bool("Dark Star") // false
        predicate.bool(1) // false
        ```
.panel.panel-default
  a(name='int')
  .panel-heading
    h4 int
      small: code predicate.int(val)

  .panel-body
    :markdown
      Returns true if `val` is an integer
    hr
    p
      small Example
      :markdown
        ```js
        predicate.int(1) // true
        predicate.int(1.5) // false
        ```
.panel.panel-default
  a(name='primitive')
  .panel-heading
    h4 primitive
      small: code predicate.primitive(val)

  .panel-body
    :markdown
      Returns true if `val` is a primitive value
    hr
    p
      small Example
      :markdown
        ```js
        predicate.primitive(1) // true
        predicate.primitive('a') // true
        predicate.primitive(null) // true
        predicate.primitive(NaN) // true
        predicate.primitive([]) // false
        predicate.primitive({}) // false
        ```
.panel.panel-default
  a(name='pos')
  .panel-heading
    h4 pos
      small: code predicate.pos(val)

  .panel-body
    :markdown
      Returns true if `val > 0` and is a `number`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.pos(1) // true
        predicate.pos(-2) // false
        predicate.pos(0) // false
        ```
.panel.panel-default
  a(name='neg')
  .panel-heading
    h4 neg
      small: code predicate.neg(val)

  .panel-body
    :markdown
      Returns true if `val < 0` and is a `number`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.neg(-2) // true
        predicate.neg(1) // false
        predicate.neg(0) // false
        ```
.panel.panel-default
  a(name='zero')
  .panel-heading
    h4 zero
      small: code predicate.zero(val)

  .panel-body
    :markdown
      Returns true if `val === 0` and is a `number`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.zero(0) // true
        predicate.zero(-2) // false
        predicate.zero(1) // false
        ```
.panel.panel-default
  a(name='even')
  .panel-heading
    h4 even
      small: code predicate.even(val)

  .panel-body
    :markdown
      Returns true if `val` is a `number`, not `zero`, and it's modulus of 2  is zero
    hr
    p
      small Example
      :markdown
        ```js
        predicate.even(2) // true
        predicate.even(0) // false
        predicate.even(1) // false
        ```
.panel.panel-default
  a(name='odd')
  .panel-heading
    h4 odd
      small: code predicate.odd(val)

  .panel-body
    :markdown
      Returns true if `val` is a `number`, not `zero`, and it's modulus of 2 is not zero
    hr
    p
      small Example
      :markdown
        ```js
        predicate.odd(1) // true
        predicate.odd(2) // false
        predicate.odd(0) // false
        ```
.panel.panel-default
  a(name='includes')
  .panel-heading
    h4 includes
      small: code predicate.includes(arr, val)
    small alias
      code predicate.contains(arr, val)

  .panel-body
    :markdown
      Returns true if `val` exists in `arr`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        var arr = [1, 2, 3, 4];
        predicate.includes(arr, 2) // true
        predicate.includes(arr, -5) // false
        ```
.panel.panel-default
  a(name='empty')
  .panel-heading
    h4 empty
      small: code predicate.empty(o)

  .panel-body
    :markdown
      Returns true if `o` is an object and has no owned props

      Returns true if `o` is an array or string of length zero

      Throws `TypeError` if `o` is not an `Array`, `Object`, or `String`
    hr
    p
      small Example
      :markdown
        ```js
        predicate.empty([]) // true
        predicate.empty(['a']) // false
        predicate.empty({}) // true
        predicate.empty({foo: 'bar'}) // false
        ```
.panel.panel-default
  a(name='has')
  .panel-heading
    h4 has
      small: code predicate.has(o, key)

  .panel-body
    :markdown
      Returns true if `string` `key` exists on `object` `o`
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        var o = { planet: 'Earth' };
        predicate.has(o, 'planet') // true
        predicate.has(o, 'moon') // false
        ```
.panel.panel-default
  a(name='instance')
  .panel-heading
    h4 instance
      small: code predicate.instance(Cls, [inst])

  .panel-body
    :markdown
      Returns true if `inst instanceof Cls` is `true`.
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        function Planet() {}
        var p = new Planet();

        var isPlanet = predicate.instance(Planet);
        isPlanet(p); // true
        predicate.instance(Planet, p); // true
        ```
.panel.panel-default
  a(name='matches')
  .panel-heading
    h4 matches
      small: code predicate.matches(rgx, val)

  .panel-body
    :markdown
      Returns rgx.test(val)
    small curryable
    hr
    p
      small Example
      :markdown
        ```js
        var rgx = /\d{3}/;
        predicate.matches(rgx, 200) // true
        predicate.matches(rgx, 50) // false
        ```
.panel.panel-default
  a(name='ternary')
  .panel-heading
    h4 ternary
      small: code predicate.ternary(pred, [a [b]])

  .panel-body
    :markdown
      **If a `pred` is given:**

      Returns a `function(a, b)` that evaluates `pred(a, b)`

      **If `pred` and `a` and is given:**

      Returns a `function(b)` that evaluates `pred(a, b)`

      **If `pred` and `a` and `b` is given:**

      Returns the evaluation of `pred(a, b)`

      **If `pred` is of type `boolean`, `a`, and `b` are given**

      Returns `bool` ? `a` : `b`
    hr
    p
      small Example
      :markdown
        ```js
        var pred1 = predicate.ternary(predicate.less);
        pred1(1, 2); // 1

        var pred2 = predicate.ternary(predicate.less, 1);
        pred2(2); // 1

        predicate.ternary(predicate.less, 1, 2); // 1
        predicate.ternary(1 < 2, 'a', 'b'); // 'a'
        ```
.panel.panel-default
  a(name='and')
  .panel-heading
    h4 and
      small: code predicate.and([p1, p2, ...pN])

  .panel-body
    :markdown
      Returns a `function` in which, when evaluated with `val`, returns `true`
      if all given predicates return `true`.
    hr
    p
      small Example
      :markdown
        ```js
        var fn = predicate.and(predicate.less(3), predicate.greater(1));
        fn(2); // true
        ```
.panel.panel-default
  a(name='or')
  .panel-heading
    h4 or
      small: code predicate.or([p1, p2, ...pN])

  .panel-body
    :markdown
      Returns a `function` in which, when evaluated with `val`, returns `true`
      if at least __one__ of the given predicates return `true`.
    hr
    p
      small Example
      :markdown
        ```js
        var fn = predicate.or(predicate.less(3), predicate.greater(1));
        fn(1); // true
        ```
a(name='chaining')
h1 Chaining
hr
.panel.panel-default
  a(name='every')
  .panel-heading
    h4 every
      small: code predicate.every()
    small alias
      code predicate.all()

  .panel-body
    :markdown
      Returns a chainable interface for lazily executing predicates.

      Invoke `.val()` which returns `true` if all predicates evaluate
      to `true`.
    hr
    p
      small Example
      :markdown
        ```js
        var chain = predicate.every();
        chain = chain.less(1, 2).fn(predicate.exists);
        chain.val(); // true
        chain.NaN(1).val(); // false

        predicate.every().exists('mars').str('asteroid').val(); //true
        ```
.panel.panel-default
  a(name='some')
  .panel-heading
    h4 some
      small: code predicate.some()
    small alias
      code predicate.any()

  .panel-body
    :markdown
      Returns a chainable interface for lazily executing predicates.

      Invoke `.val()` which returns `true` if at least 1 predicate evaluate
      to `true`.
    hr
    p
      small Example
      :markdown
        ```js
        var chain = predicate.some();
        chain = chain.equal(1, 2).fn(predicate.exists);
        chain.val(); // true
        chain.NaN(1).val(); // true

        predicate.some().exists(null).str('asteroid').val(); // true
        predicate.some().exists(null).str(1).val(); // false
        ```
a(name='utils')
h1 Utils
hr
.panel.panel-default
  a(name='curry')
  .panel-heading
    h4 curry
      small: code predicate.curry(fn)

  .panel-body
    :markdown
      Returns a new function that curries a given `fn`.

    small Used internally
    hr
    p
      small Example
      :markdown
        ```js
        var fn = predicate.curry(function add(a, b) {
          return a + b;
        });
        var fn2 = add(1);

        fn2(2); // 3
        fn2(5); // 6
        fn(2, 2); // 4
        ```
.panel.panel-default
  a(name='partial')
  .panel-heading
    h4 partial
      small: code predicate.partial(fn, ...)

  .panel-body
    :markdown
      Returns a partially applied function based on `fn`.

    small Used internally
    hr
    p
      small Example
      :markdown
        ```js
        var fn = predicate.partial(predicate.less, 1);
        fn(2); // true
        ```
.panel.panel-default
  a(name='complement')
  .panel-heading
    h4 complement
      small: code predicate.complement(fn)
    small alias
      code predicate.invert(fn)

  .panel-body
    :markdown
      Returns a function a that receives the same args as `fn` and returns
      the opposite truth value.

    small Used internally
    hr
    p
      small Example
      :markdown
        ```js
        var fn = predicate.complement(predicate.fn);
        fn(predicate.fn); // false
        ```
.panel.panel-default
  a(name='mod')
  .panel-heading
    h4 mod
      small: code predicate.mod(a, b)

  .panel-body
    :markdown
      Returns the value of `a % b`

    small Used internally
    hr
    p
      small Example
      :markdown
        ```js
        predicate.mod(6, 5); // 1
        predicate.mod(6, 6); // 0
        ```
