@blakek/set-operations

🧮 Common set operations (union, difference, isSubset, etc.) for any Iterable

Usage no npm install needed!

<script type="module">
  import blakekSetOperations from 'https://cdn.skypack.dev/@blakek/set-operations';
</script>

README

set-operations

🧮 Common set operations (union, difference, isSubset, etc.) for any Iterable

Provides helpers like isSuperset, difference, etc. for Iterables.

Install

Using Yarn:

$ yarn add @blakek/set-operations

…or using [npm]:

$ npm i --save @blakek/set-operations

API

import {
  difference,
  filter,
  intersection,
  isSubset,
  isSuperset,
  symmetricDifference,
  union
} from '@blakek/set-operations';

difference();

difference

function difference<T>(groupA: Iterable<T>, groupB: Iterable<T>): Iterable<T>;

Returns values in one group not in another:

import { difference } from '@blakek/set-operations';

difference(['a', 'b', 'c'], ['b', 'a']);
// » Set { 'c' }

filter

function filter<T>(group: Set<T>, fn: (value: T) => boolean): Set<T>;

Returns a new Set from all elements in a group matching a filtering function:

import { filter } from '@blakek/set-operations';

filter(new Set([1, 2, 3, 4, 5]), x => x < 4);
// » Set { 1, 2, 3 }

intersection

function intersection<T>(groupA: Iterable<T>, groupB: Iterable<T>): Iterable<T>;

Returns only values shared between groups:

import { intersection } from '@blakek/set-operations';

intersection([4, 5, 6], [5, 6]);
// » Set { 5, 6 }

intersection('showers', 'flowers');
// » Set { 's', 'o', 'w', 'e', 'r' }

isSubset

function isSubset<T>(groupA: Iterable<T>, groupB: Iterable<T>): boolean;

Returns if the first group is a subset of the second:

import { isSubset } from '@blakek/set-operations';

isSubset([4, 5, 6], [5, 6]);
// » false

isSubset([2, 4, 6], [1, 2, 3, 4, 5, 6]);
// » true

isSubset('fame', 'frame');
// » true

isSuperset

function isSuperset<T>(groupA: Iterable<T>, groupB: Iterable<T>): boolean;

Returns if the first group is a superset of the second:

import { isSuperset } from '@blakek/set-operations';

isSuperset([4, 5, 6], [5, 6]);
// » true

isSuperset([2, 4, 6], [1, 2, 3, 4, 5, 6]);
// » false

isSuperset('fame', 'frame');
// » false

symmetricDifference

function symmetricDifference<T>(
  groupA: Iterable<T>,
  groupB: Iterable<T>
): Iterable<T>;

Returns values in either group not in both:

import { symmetricDifference } from '@blakek/set-operations';

symmetricDifference([2, 4, 6], [1, 2, 3, 4, 5, 6]);
// » Set { 1, 3, 5 }

symmetricDifference('shower', 'flower');
// » Set { 's', 'h', 'f', 'l' }

union

function union<T>(groupA: Iterable<T>, groupB: Iterable<T>): Iterable<T>;

Returns all values from each group:

import { union } from '@blakek/set-operations';

union([2, 4, 6], [1, 2, 3, 4, 5, 6]);
// » Set { 2, 4, 6, 1, 3, 5 }

union('fun', 'sun');
// » Set { 'f', 'u', 'n', 's' }

Contributing

Node.js and Yarn are required to work with this project.

To install all dependencies, run:

yarn

Then, you can start the test server to get started:

yarn test --watch

See below for other scripts.

Useful Commands

yarn build Builds the project to ./dist
yarn format Format the source following the Prettier styles
yarn test Run project tests
yarn test --watch Run project tests, watching for file changes

License

MIT