not-predicate
TypeScript icon, indicating that this package has built-in type declarations

2.0.1 • Public • Published

build Code Style: Google

not-predicate

Predicate negation. A predicate that negates a result of its predicate argument:

import {not} from 'not-predicate';

const isEven = (n: number) => n % 2 === 0;

console.log([1, 2, 8, 5].filter(not(isEven)));
//=> [ 1, 5 ]

Why to use

You cannot simply use the ! negation operator on functions, because you cannot cast a function type to boolean:

// You cannot do this:
[3, 2, 8, 5].filter(!isEven);

not acts as a predicate, so we can use it:

[3, 2, 8, 5].filter(not(isEven)); //=> [ 3, 5 ]

Plus, there are more not-predicate's advantages:

  • Works well with RxJS, Array.filter and others.
  • Typed. With d.ts for Javascript.
  • Zero-dependency.
  • Well tested.

Installation

$ npm install not-predicate

Usage

Typescript / ES module:

import {not} from 'not-predicate';

Javascript / CommonJS:

const {not} = require('not-predicate');

More

Correctly negates a predicate that uses an index argument:

const isElementIndexEven = (_: unknown, index: number) => index % 2 === 0;

console.log(['a', 'a', 'a', 'abc'].map(not(isElementIndexEven)));
//=> [ false, true, false, true ];

Deals with this object properly:

const customWindow = {
  innerWidth: 640,
  innerHeight: 480,
};

function canXCoordFit(x) {
  return x > 0 && x <= this.innerWidth;
}

const xValues = [-10, 20, 680, 600, 800, 5];
const xsThatCanFit1 = xValues.filter(not(canXCoordFit), customWindow);
const xsThatCanFit2 = xValues.filter(not(canXCoordFit).bind(customWindow));
console.log(xsThatCanFit1, xsThatCanFit2);
//=> [ -10, 680, 800 ] [ -10, 680, 800 ]

A predicate type is also provided:

export type TPredicate<T> = (value: T, index: number) => boolean;

We can also use the not-predicate in RxJS:

import {not} from 'not-predicate';
import {from} from 'rxjs';
import {filter} from 'rxjs/operators';

const evenValueOnEvenIndex = (val: number, index: number) =>
  val % 2 === 0 && index % 2 === 0;

const src = from([1, 3, 5, 4, 6, 8]).pipe(filter(not(evenValueOnEvenIndex)));
const res: number[] = [];
src.subscribe(x => res.push(x));
console.log(res);
//=> [ 1, 3, 5, 4, 8 ]

Package Sidebar

Install

npm i not-predicate

Weekly Downloads

0

Version

2.0.1

License

MIT

Unpacked Size

6.79 kB

Total Files

6

Last publish

Collaborators

  • tomaskraus