Skip to content

Commit

Permalink
refactored funcitons to use sets.shift() & for .. of (#43)
Browse files Browse the repository at this point in the history
* shift sets

Also: removed nullish coalescing & renamed result to resultSet

* for (const set of sets)
  • Loading branch information
kubikowski authored Oct 28, 2022
1 parent 531d4e6 commit d90cb4a
Show file tree
Hide file tree
Showing 10 changed files with 46 additions and 41 deletions.
6 changes: 3 additions & 3 deletions src/comparisons/disjoint.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ export function disjoint<T, S extends ReadonlySet<T>>(...sets: S[]): boolean {
return true;
}

const allElements = new Set<T>(sets[0]);
for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
const allElements = new Set<T>(sets.shift());
for (const set of sets) {
for (const element of set) {
if (allElements.has(element)) {
return false;
} else {
Expand Down
7 changes: 4 additions & 3 deletions src/comparisons/equivalence.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ export function equivalence<T, S extends ReadonlySet<T>>(...sets: S[]): boolean
return false;
}

for (const element of sets[0]!) {
for (let index = 1; index < sets.length; index++) {
if (!sets[index]?.has(element)) {
const primarySet = sets.shift()!;
for (const element of primarySet) {
for (const set of sets) {
if (!set.has(element)) {
return false;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/comparisons/proper-subset.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ export function properSubset<T, S extends ReadonlySet<T>>(...sets: S[]): boolean
return false;
}

for (const element of sets[0]!) {
for (let index = 1; index < sets.length; index++) {
if (!sets[index]?.has(element)) {
const primarySet = sets.shift()!;
for (const element of primarySet) {
for (const set of sets) {
if (!set.has(element)) {
return false;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/comparisons/proper-superset.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ export function properSuperset<T, S extends ReadonlySet<T>>(...sets: S[]): boole
return false;
}

for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
if (!sets[0]?.has(element)) {
const primarySet = sets.shift()!;
for (const set of sets) {
for (const element of set) {
if (!primarySet.has(element)) {
return false;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/comparisons/subset.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,10 @@ export function subset<T, S extends ReadonlySet<T>>(...sets: S[]): boolean {
return false;
}

for (const element of sets[0]!) {
for (let index = 1; index < sets.length; index++) {
if (!sets[index]?.has(element)) {
const primarySet = sets.shift()!;
for (const element of primarySet) {
for (const set of sets) {
if (!set.has(element)) {
return false;
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/comparisons/superset.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,10 @@ export function superset<T, S extends ReadonlySet<T>>(...sets: S[]): boolean {
return false;
}

for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
if (!sets[0]?.has(element)) {
const primarySet = sets.shift()!;
for (const set of sets) {
for (const element of set) {
if (!primarySet.has(element)) {
return false;
}
}
Expand Down
10 changes: 5 additions & 5 deletions src/operations/difference.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ export function difference<T>(...sets: ReadonlySet<T>[]): ReadonlySet<T>;
* @description A ∖ B ≔ { x : (x ∈ A) ∧ (x ∉ B) }
*/
export function difference<T, S extends ReadonlySet<T>>(...sets: S[]): S {
const result = new Set<T>(sets[0]);
const resultSet = new Set<T>(sets.shift());

for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
result.delete(element);
for (const set of sets) {
for (const element of set) {
resultSet.delete(element);
}
}

return result as ReadonlySet<T> as S;
return resultSet as ReadonlySet<T> as S;
}
12 changes: 6 additions & 6 deletions src/operations/intersection.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ export function intersection<T>(...sets: ReadonlySet<T>[]): ReadonlySet<T>;
* @description A ∩ B ≔ { x : (x ∈ A) ∧ (x ∈ B) }
*/
export function intersection<T, S extends ReadonlySet<T>>(...sets: S[]): S {
const result = new Set<T>(sets[0]);
const resultSet = new Set<T>(sets.shift());

for (let index = 1; index < sets.length; index++) {
for (const element of result) {
if (!sets[index]!.has(element)) {
result.delete(element);
for (const set of sets) {
for (const element of resultSet) {
if (!set.has(element)) {
resultSet.delete(element);
}
}
}

return result as ReadonlySet<T> as S;
return resultSet as ReadonlySet<T> as S;
}
10 changes: 5 additions & 5 deletions src/operations/union.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ export function union<T>(...sets: ReadonlySet<T>[]): ReadonlySet<T>;
* @description A ∪ B ≔ { x : (x ∈ A) ∨ (x ∈ B) }
*/
export function union<T, S extends ReadonlySet<T>>(...sets: S[]): S {
const result = new Set<T>(sets[0]);
const resultSet = new Set<T>(sets.shift());

for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
result.add(element);
for (const set of sets) {
for (const element of set) {
resultSet.add(element);
}
}

return result as ReadonlySet<T> as S;
return resultSet as ReadonlySet<T> as S;
}
14 changes: 7 additions & 7 deletions src/operations/xor.function.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,19 +11,19 @@ export function xor<T>(...sets: ReadonlySet<T>[]): ReadonlySet<T>;
* @description A ∆ B ≔ { x : (x ∈ A) ⊕ (x ∈ B) }
*/
export function xor<T, S extends ReadonlySet<T>>(...sets: S[]): S {
const result = new Set<T>(sets[0]);
const resultSet = new Set<T>(sets.shift());
const reusedElements = new Set<T>();

for (let index = 1; index < sets.length; index++) {
for (const element of sets[index]!) {
if (result.has(element)) {
result.delete(element);
for (const set of sets) {
for (const element of set) {
if (resultSet.has(element)) {
resultSet.delete(element);
reusedElements.add(element);
} else if (!reusedElements.has(element)) {
result.add(element);
resultSet.add(element);
}
}
}

return result as ReadonlySet<T> as S;
return resultSet as ReadonlySet<T> as S;
}

0 comments on commit d90cb4a

Please sign in to comment.