-
Notifications
You must be signed in to change notification settings - Fork 0
/
set.ts
133 lines (118 loc) · 3.24 KB
/
set.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/** A set data structure, unordered with no duplicate values. */
export default class Set {
dictionary: { [value: string]: true } = {};
length = 0;
/**
* Adds a value to the set (if it is not already present).
* @param {string} value - The value you wish to add.
* @returns `true` if the value was successfully added, `false` if the value
* was already present in the set.
*/
add(value: string): boolean {
if (this.has(value)) {
return false;
} else {
this.dictionary[value] = true;
this.length++;
return true;
}
}
/**
* Removes a value from a set (if present).
* @param {string} value - The value you wish to remove.
* @returns `true` if the value was successfully removed, `false` if the value
* was not present in the set.
*/
remove(value: string): boolean {
if (this.has(value)) {
delete this.dictionary[value];
this.length--;
return true;
} else {
return false;
}
}
/** Checks for the presence of a value. */
has(value: string): boolean {
return this.dictionary[value] !== undefined;
}
/** Returns all values in the set as an array. */
values(): string[] {
return Object.keys(this.dictionary);
}
/** Returns the number of (unique) values in the set. */
size(): number {
return this.length;
}
/** Clears the contents of the set. */
clear(): void {
this.dictionary = {};
this.length = 0;
}
/**
* Returns the union of this set and the set passed to this function; that is,
* the set of all values present in at least one of the two sets.
*/
union(otherSet: Set): Set {
const union = new Set();
// Add values from this set
for (const value of this.values()) {
union.add(value);
}
// Add values from passed set
for (const value of otherSet.values()) {
union.add(value);
}
return union;
}
/**
* Returns the intersection of this set and the set passed to this function;
* that is, the set of all values present in both of the two sets.
*/
intersection(otherSet: Set): Set {
const intersection = new Set();
let smallerSet: Set, largerSet: Set;
if (this.length <= otherSet.size()) {
smallerSet = this;
largerSet = otherSet;
} else {
smallerSet = otherSet;
largerSet = this;
}
for (const value of smallerSet.values()) {
if (largerSet.has(value)) {
intersection.add(value);
}
}
return intersection;
}
/**
* Returns the difference of this set from the set passed to this function;
* that is, the set of all values present in this set but not in the passed
* set.
*/
difference(otherSet: Set): Set {
const difference = new Set();
for (const value of this.values()) {
if (!otherSet.has(value)) {
difference.add(value);
}
}
return difference;
}
/**
* Returns whether or not this set is a subset of the set passed to this
* function; that is, whether or not all values in this set are also in the
* passed set.
*/
isSubset(otherSet: Set): boolean {
let isSubset = true;
for (const value of this.values()) {
if (!otherSet.has(value)) {
isSubset = false;
break;
}
}
return isSubset;
}
}