Skip to content
/ sets Public

a TypeScript library for working with sets, with a ponyfill for TC39's Set Methods proposal

License

Notifications You must be signed in to change notification settings

nc-js/sets

Repository files navigation

@neoncitylights/set-theory

GitHub license npm version codecov Node.js workflow FOSSA Status

A library written in TypeScript implementing the mathematical branch known as set theory - a subset of discrete mathematics.

While there is a current proposal for adding new methods to the Set class1, it is not formally recommended yet. This library provides functions to coincide with the Set class2, as standardized by the ECMAScript Language Specification. 3.

Install

npm install @neoncitylights/set-theory

Usage

const a = new Set<number>([1, 2, 3, 4]);
const b = new Set<number>([4, 5, 6, 7]);
getIntersection(a, b); // new Set<number>([4])
getUnion(a, b); // new Set<number>([1, 2, 3, 4, 5, 6, 7])

const c = new Set<string>(["hello", "world"]);
const d = new Set<string>(["hello"]);
isSupersetOf(c, d); // true
isSubsetOf(d, c); // true

Documentation

Auto-generated API documentation is available.

API Reference

Predicates

  • # predicates.areSetsDisjoint<TElement>(a, b): booleansource
  • # predicates.areSetsEquivalent<TElement>(a, b): booleansource
  • # predicates.areSetsEqual<TElement>(a, b): booleansource
  • # predicates.isSubsetOf<TElement>(a, b): booleansource
  • # predicates.isSupersetOf<TElement>(a, b): booleansource
  • # predicates.isProperSubsetOf<TElement>(a, b): booleansource
  • # predicates.isProperSupersetOf<TElement>(a, b): booleansource

Operations

  • # operations.getUnion<TElement>(a, b): Set<TElement> • source
  • # operations.getIntersection<TElement>(a, b): Set<TElement> • source
  • # operations.getDifference<TElement>(a, b): Set<TElement> • source
  • # operations.getSymmetricDifference<TElement>(a, b): Set<TElement> • source

Similarity measuring algorithms

  • # similarity.getJaccardSimilarityCoefficient<TElement>(a, b): numbersource
  • # similarity.getLogDice<TElement>(a, b): numbersource
  • # similarity.getOverlapCoefficient<TElement>(a, b): numbersource
  • # similarity.getSorensenDiceCoefficient<TElement>(a, b): numbersource

Types

This library provides generic types for describing different types of set functions via:

  • SetFunction<TElement>
  • SetOperation<TElement>
  • SetPredicate<TElement>
  • SetSimilarity<TElement>

Set Theory 101

Set

A set is an unordered collection of unique elements. The type of elements can be anything, such as words, numbers, and even other sets. In math, the name of sets are usually denoted with a capital letter, like $A$, $B$, $C$, etc. They can be expressed in namely 2 different notations being "Roster notation" and "Set-Builder notation".

Roster notation

Sets are written with curly brackets at the start and end, and each element is separated by a comma. $$A = \{1, 2, 3, 4\}$$

For expressing larger, finite sets, we can use an ellipsis in-between. They can also be at the beginning or end to indicate that the set is infinite.

$$ \begin{aligned} B &= \{ 1, 2, 3, \dots, 100 \} \\ C &= \{ 1, 3, 5, 7, 9, \dots \} \end{aligned} $$

Set-builder notation

Sets are written by defining a variable, and declaring a predicate (a statement that must be true or false) for that variable. For example, to express $\{ 0, 1, 2, 3, \dots, 10 \}$ in set-builder notation:

$$\{ x|x \in \mathbb{Z} \land 0 \leq x \leq 10 \}$$

To express $\{ 1, 3, 5, 7, 9, \dots \}$ in set-builder notation:

$$\{ x| x_n = n + 2, 1 \le x \le \infty \}$$

Compared to roster notation, set-builder notation is a way of more rigorously4 defining a set. However, it is important to note that depending on the audience, it can be less accessible to readers.

Cardinality

Cardinality is the formal term that represents the number of elements within a set. It is also known as the "size" of the element. Given a set named $A$, the cardinality can be expressed using pipes, via $|A|$.

$$ \begin{aligned} A &= \{ \text{hello}, \text{world} \} \\ |A| &= 2 \end{aligned} $$

Disjoint sets

Disjoint sets are sets that have no elements in common. Given two sets named $A$ and $B$, they are formally expressed as $A \cap B = \Phi$.

$$ \begin{aligned} A &= \{ 1, 2, 3, 4 \} \\ B &= \{ 5, 6, 7, 8 \} \\ A \cap B &= \Phi \end{aligned} $$

Equivalent sets

Equivalent sets are two sets that have the same cardinality.

$$ \begin{aligned} A &= \{ 5, 6, 7, 8, 9, 10 \} \\ B &= \{ 11, 12, 13, 14, 15, 16 \} \\ |A| &= |B| \end{aligned} $$

Equal sets

Equal sets are sets that have the same cardinality and the same elements.

$$ \begin{aligned} A &= \{ 1, 2, 3, 4, 5 \} \\ B &= \{ 1, 2, 3, 4, 5 \} \\ A &= B \end{aligned} $$

Subset

A subset is a set where all elements of set $A$ are in set $B$.

$$ \begin{aligned} A &= \{ 1, 2, 3 \} \\ B &= \{ 1, 2, 3, 4, 5 \} \\ A &\subseteq B \end{aligned} $$

Superset

A superset is a set where all elements of $B$ are in set $A$.

$$ \begin{aligned} A &= \{ 4, 5, 6 \} \\ B &= \{ 5, 6, 7, 8, 9 \} \\ B &\supseteq A \end{aligned} $$

Proper subset

A proper subset is when set $A$ is a subset of $B$, but $A \neq B$.

$$ \{ 1 \} \subset \{ 1, 3 \} $$

Proper superset

A proper superset is when set $A$ is a superset of $B$, but $A \neq B$.

$$ \{ 2, 3, 9 \} \supset \{ 3, 9 \} $$

Intersection

The intersection is the set of elements that are the members of two sets.

$$ \begin{aligned} A &= \{ 1, 2, 3, 4, 5 \} \\ B &= \{ 3, 4, 5, 6, 7 \} \\ A \cap B &= \{ 3, 4, 5 \} \end{aligned} $$

Union

The union is the set of all elements in a collection of sets.

$$ \begin{aligned} A &= \{ 1, 2, 3, 4 \} \\ B &= \{ 4, 5, 6, 7, 8 \} \\ A \cup B &= \{1, 2, 3, 4, 5, 6, 7, 8 \} \end{aligned} $$

Difference

The difference (also known as the complement) is the set of all elements that are in set A that are not in set B.

$$ \begin{aligned} A &= \{ 1, 2, 3, 4 \} \\ B &= \{ 2, 3, 5, 6 \} \\ A \setminus B &= \{ 1, 4 \} \end{aligned} $$

Symmetric difference

The symmetric difference is the set that belongs to one but not both of two sets.

$$ \begin{aligned} A &= \{ 2, 4, 5, 8 \} \\ B &= \{ 2, 6, 7, 8 \} \\ A ~\Delta ~ B &= \{ 4, 5, 6, 7 \} \end{aligned} $$

Symbols

Character Code point Name
U+2286 Subset
U+2287 Superset
U+2282 Proper subset
U+2283 Proper superset
U+03D5 Empty set
U+2208 Element of
U+2209 Not element of
U+2229 Intersection
U+222A Union
\ U+005C Complement/difference
U+25B3 Symmetric difference
U+2296 Symmetric difference
× U+00D7 Cartesian product
U+2115 Set of all natural numbers
𝕎 U+1D54E Set of all whole numbers
U+2124 Set of all integer numbers
U+211A Set of all rational numbers
𝔽 U+1D53D Set of all irrational numbers
U+211D Set of all real numbers
U+2102 Set of all complex numbers

License

This library is licensed under the MIT License.

FOSSA Status

Footnotes

  1. Wadas, M., & Gunasekaran, S. (n.d.). New Set methods. New set methods. Retrieved November 1, 2021, from https://tc39.es/proposal-set-methods/.

  2. MDN Web Docs Contributors. (n.d.). Set - javascript: MDN. JavaScript | MDN. Retrieved November 1, 2021, from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set.

  3. TC39. (2021, October 30). Draft ECMA-262 / October 30, 2021. ECMAScript® 2022 Language Specification. Retrieved November 1, 2021, from https://tc39.es/ecma262/#sec-set-objects.

  4. Wikipedia contributors. (2021, November 1). Rigour. In Wikipedia, The Free Encyclopedia. Retrieved 17:24, November 1, 2021, from https://en.wikipedia.org/w/index.php?title=Rigour&oldid=1053055627