Skip to content

Commit 6451d80

Browse files
committed
Allow unbounded sets.
1 parent d911874 commit 6451d80

File tree

4 files changed

+56
-12
lines changed

4 files changed

+56
-12
lines changed

src/disjoint.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import set from "./set.js";
2-
31
export default function disjoint(values, other) {
4-
other = set(other);
5-
for (const value of values) {
6-
if (other.has(value)) {
7-
return false;
2+
const iterator = other[Symbol.iterator](), set = new Set();
3+
for (const v of values) {
4+
if (set.has(v)) return false;
5+
let value, done;
6+
while (({value, done} = iterator.next())) {
7+
if (done) break;
8+
if (Object.is(v, value)) return false;
9+
set.add(value);
810
}
911
}
1012
return true;

src/superset.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import set from "./set.js";
2-
31
export default function superset(values, other) {
4-
values = set(values);
5-
for (const value of other) {
6-
if (!values.has(value)) {
7-
return false;
2+
const iterator = values[Symbol.iterator](), set = new Set();
3+
for (const o of other) {
4+
if (set.has(o)) continue;
5+
let value, done;
6+
while (({value, done} = iterator.next())) {
7+
if (done) return false;
8+
set.add(value);
9+
if (Object.is(o, value)) break;
810
}
911
}
1012
return true;

test/disjoint-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,23 @@ tape("disjoint(values, other) returns true if sets are disjoint", (test) => {
66
test.equal(d3.disjoint([2, 3], [3, 4]), false);
77
test.equal(d3.disjoint([1], []), true);
88
});
9+
10+
tape("disjoint(values, other) allows values to be infinite", (test) => {
11+
test.equal(d3.disjoint(odds(), [0, 2, 4, 5]), false);
12+
});
13+
14+
tape("disjoint(values, other) allows other to be infinite", (test) => {
15+
test.equal(d3.disjoint([2], repeat(1, 3, 2)), false);
16+
});
17+
18+
function* odds() {
19+
for (let i = 1; true; i += 2) {
20+
yield i;
21+
}
22+
}
23+
24+
function* repeat(...values) {
25+
while (true) {
26+
yield* values;
27+
}
28+
}

test/superset-test.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,23 @@ tape("superset(values, other) returns true if values is a superset of others", (
66
test.equal(d3.superset([2, 3], [3, 4]), false);
77
test.equal(d3.superset([1], []), true);
88
});
9+
10+
tape("superset(values, other) allows values to be infinite", (test) => {
11+
test.equal(d3.superset(odds(), [1, 3, 5]), true);
12+
});
13+
14+
tape("superset(values, other) allows other to be infinite", (test) => {
15+
test.equal(d3.superset([1, 3, 5], repeat(1, 3, 2)), false);
16+
});
17+
18+
function* odds() {
19+
for (let i = 1; true; i += 2) {
20+
yield i;
21+
}
22+
}
23+
24+
function* repeat(...values) {
25+
while (true) {
26+
yield* values;
27+
}
28+
}

0 commit comments

Comments
 (0)