@blackglory/structures 0.14.3 → 0.14.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -555,6 +555,8 @@ class BitSet {
555
555
  add(value: number): boolean
556
556
  delete(value: number): boolean
557
557
  clear(): void
558
+
559
+ clone(): BitSet
558
560
  }
559
561
  ```
560
562
 
@@ -581,3 +583,15 @@ class TypedBitSet<T extends UnsignedTypedArrayConstructor> {
581
583
 
582
584
  Due to the length of arrays supported by JavaScript,
583
585
  `TypedBitSit` cannot support very large values.
586
+
587
+ ### DisjointSet
588
+ ```ts
589
+ class DisjointSet {
590
+ has(value: number): boolean
591
+ sets(): number[][]
592
+
593
+ makeSet(value: number): number
594
+ union(a: number, b: number): void
595
+ find(value: number): number
596
+ }
597
+ ```
package/lib/bit-set.d.ts CHANGED
@@ -13,6 +13,7 @@ export declare class BitSet {
13
13
  add(value: number): boolean;
14
14
  delete(value: number): boolean;
15
15
  clear(): void;
16
+ clone(): BitSet;
16
17
  private getPosition;
17
18
  private getMask;
18
19
  }
package/lib/bit-set.js CHANGED
@@ -82,6 +82,13 @@ export class BitSet {
82
82
  this._size = 0;
83
83
  this.array.length = 0;
84
84
  }
85
+ clone() {
86
+ const clone = new BitSet(this.bitsPerElement);
87
+ clone.array = [...this.array];
88
+ clone.length = this.length;
89
+ clone._size = this._size;
90
+ return clone;
91
+ }
85
92
  getPosition(value) {
86
93
  const remainder = value % this.bitsPerElement;
87
94
  const quotient = (value - remainder) / this.bitsPerElement;
@@ -1 +1 @@
1
- {"version":3,"file":"bit-set.js","sourceRoot":"","sources":["../src/bit-set.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bit-set.js","sourceRoot":"","sources":["../src/bit-set.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare class DisjointSet {
2
+ private parent;
3
+ private rank;
4
+ has(value: number): boolean;
5
+ sets(): number[][];
6
+ makeSet(value: number): number;
7
+ union(a: number, b: number): void;
8
+ find(value: number): number;
9
+ }
@@ -0,0 +1,59 @@
1
+ import { assert } from '@blackglory/errors';
2
+ import { isntUndefined } from 'extra-utils';
3
+ export class DisjointSet {
4
+ constructor() {
5
+ this.parent = [];
6
+ this.rank = [];
7
+ }
8
+ has(value) {
9
+ return isntUndefined(this.parent[value]);
10
+ }
11
+ sets() {
12
+ const results = [];
13
+ for (let i = 0, len = this.parent.length; i < len; i++) {
14
+ if (this.has(i)) {
15
+ const set = this.find(i);
16
+ if (!results[set]) {
17
+ results[set] = [];
18
+ }
19
+ results[set].push(i);
20
+ }
21
+ }
22
+ return results.filter(isntUndefined);
23
+ }
24
+ makeSet(value) {
25
+ assert(!this.has(value), 'The value already belongs to a set');
26
+ this.parent[value] = value;
27
+ this.rank[value] = 0;
28
+ return value;
29
+ }
30
+ union(a, b) {
31
+ const aRoot = this.find(a);
32
+ const bRoot = this.find(b);
33
+ if (aRoot === bRoot)
34
+ return;
35
+ const aRootRank = this.rank[aRoot];
36
+ const bRootRank = this.rank[bRoot];
37
+ if (aRootRank === bRootRank) {
38
+ this.parent[aRoot] = bRoot;
39
+ this.rank[bRoot]++;
40
+ }
41
+ else if (aRootRank < bRootRank) {
42
+ this.parent[aRoot] = bRoot;
43
+ }
44
+ else {
45
+ this.parent[bRoot] = aRoot;
46
+ }
47
+ }
48
+ find(value) {
49
+ const nodeValue = this.parent[value];
50
+ assert(isntUndefined(nodeValue), 'The value does not belong to any set');
51
+ if (nodeValue === value)
52
+ return value;
53
+ const parentNode = nodeValue;
54
+ const root = this.find(parentNode);
55
+ this.parent[value] = root;
56
+ return root;
57
+ }
58
+ }
59
+ //# sourceMappingURL=disjoint-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disjoint-set.js","sourceRoot":"","sources":["../src/disjoint-set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,OAAO,WAAW;IAAxB;QACU,WAAM,GAAa,EAAE,CAAA;QACrB,SAAI,GAAa,EAAE,CAAA;IA0D7B,CAAC;IAxDC,GAAG,CAAC,KAAa;QACf,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1C,CAAC;IAED,IAAI;QACF,MAAM,OAAO,GAAe,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACxB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAA;gBACnB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtB,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,oCAAoC,CAAC,CAAA;QAE9D,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEpB,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,CAAS,EAAE,CAAS;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE1B,IAAI,KAAK,KAAK,KAAK;YAAE,OAAM;QAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAElC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;YAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;QACpB,CAAC;aAAM,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,KAAa;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,sCAAsC,CAAC,CAAA;QACxE,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO,KAAK,CAAA;QAErC,MAAM,UAAU,GAAG,SAAS,CAAA;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAA;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
package/lib/index.d.ts CHANGED
@@ -24,3 +24,4 @@ export { DynamicTypedArray } from './dynamic-typed-array.js';
24
24
  export * from './sorted-set.js';
25
25
  export * from './bit-set.js';
26
26
  export * from './typed-bit-set.js';
27
+ export * from './disjoint-set.js';
package/lib/index.js CHANGED
@@ -24,4 +24,5 @@ export { DynamicTypedArray } from './dynamic-typed-array.js';
24
24
  export * from './sorted-set.js';
25
25
  export * from './bit-set.js';
26
26
  export * from './typed-bit-set.js';
27
+ export * from './disjoint-set.js';
27
28
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAA;AACxB,cAAc,WAAW,CAAA;AACzB,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,wBAAwB,CAAA;AACtC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,eAAe,CAAA;AAC7B,cAAc,eAAe,CAAA;AAC7B,cAAc,sBAAsB,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,uBAAuB,CAAA;AACrC,cAAc,uBAAuB,CAAA;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blackglory/structures",
3
- "version": "0.14.3",
3
+ "version": "0.14.5",
4
4
  "description": "",
5
5
  "files": [
6
6
  "lib",
@@ -19,9 +19,7 @@
19
19
  "scripts": {
20
20
  "prepare": "ts-patch install -s",
21
21
  "lint": "eslint --ext .js,.jsx,.ts,.tsx --quiet src __tests__",
22
- "test": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --runInBand --config jest.config.cjs",
23
- "test:debug": "cross-env NODE_OPTIONS=--experimental-vm-modules node --inspect-brk node_modules/.bin/jest --runInBand --config jest.config.cjs",
24
- "test:coverage": "cross-env NODE_OPTIONS=--experimental-vm-modules jest --coverage --config jest.config.cjs",
22
+ "test": "vitest --run",
25
23
  "prepublishOnly": "run-s prepare clean build",
26
24
  "clean": "rimraf lib",
27
25
  "build": "tsc --project tsconfig.build.json --outDir lib",
@@ -37,10 +35,8 @@
37
35
  }
38
36
  },
39
37
  "devDependencies": {
40
- "@blackglory/jest-resolver": "^0.3.1",
41
38
  "@commitlint/cli": "^18.6.1",
42
39
  "@commitlint/config-conventional": "^18.6.2",
43
- "@types/jest": "^29.5.12",
44
40
  "@types/node": "16",
45
41
  "@typescript-eslint/eslint-plugin": "^7.0.1",
46
42
  "@typescript-eslint/parser": "^7.0.1",
@@ -50,18 +46,18 @@
50
46
  "extra-generator": "^0.5.4",
51
47
  "extra-promise": "^6.2.0",
52
48
  "husky": "^4.3.8",
53
- "jest": "^29.7.0",
54
- "jest-resolve": "^29.7.0",
55
49
  "npm-run-all": "^4.1.5",
56
50
  "return-style": "^3.0.1",
57
51
  "rimraf": "^5.0.5",
58
52
  "standard-version": "^9.5.0",
59
- "ts-jest": "^29.1.2",
60
53
  "ts-patch": "^3.1.2",
61
54
  "tslib": "^2.6.2",
62
55
  "tsx": "^4.7.1",
63
56
  "typescript": "5.3.3",
64
- "typescript-transform-paths": "^3.4.6"
57
+ "typescript-transform-paths": "^3.4.6",
58
+ "vite": "^5.4.2",
59
+ "vite-tsconfig-paths": "^5.0.1",
60
+ "vitest": "^2.0.5"
65
61
  },
66
62
  "dependencies": {
67
63
  "@blackglory/errors": "^3.0.3",
package/src/bit-set.ts CHANGED
@@ -108,6 +108,16 @@ export class BitSet {
108
108
  this.array.length = 0
109
109
  }
110
110
 
111
+ clone(): BitSet {
112
+ const clone = new BitSet(this.bitsPerElement)
113
+
114
+ clone.array = [...this.array]
115
+ clone.length = this.length
116
+ clone._size = this._size
117
+
118
+ return clone
119
+ }
120
+
111
121
  private getPosition(value: number): [index: number, mask: number] {
112
122
  const remainder = value % this.bitsPerElement
113
123
  const quotient = (value - remainder) / this.bitsPerElement
@@ -0,0 +1,64 @@
1
+ import { assert } from '@blackglory/errors'
2
+ import { isntUndefined } from 'extra-utils'
3
+
4
+ export class DisjointSet {
5
+ private parent: number[] = []
6
+ private rank: number[] = []
7
+
8
+ has(value: number): boolean {
9
+ return isntUndefined(this.parent[value])
10
+ }
11
+
12
+ sets(): number[][] {
13
+ const results: number[][] = []
14
+ for (let i = 0, len = this.parent.length; i < len; i++) {
15
+ if (this.has(i)) {
16
+ const set = this.find(i)
17
+ if (!results[set]) {
18
+ results[set] = []
19
+ }
20
+ results[set].push(i)
21
+ }
22
+ }
23
+ return results.filter(isntUndefined)
24
+ }
25
+
26
+ makeSet(value: number): number {
27
+ assert(!this.has(value), 'The value already belongs to a set')
28
+
29
+ this.parent[value] = value
30
+ this.rank[value] = 0
31
+
32
+ return value
33
+ }
34
+
35
+ union(a: number, b: number): void {
36
+ const aRoot = this.find(a)
37
+ const bRoot = this.find(b)
38
+
39
+ if (aRoot === bRoot) return
40
+
41
+ const aRootRank = this.rank[aRoot]
42
+ const bRootRank = this.rank[bRoot]
43
+
44
+ if (aRootRank === bRootRank) {
45
+ this.parent[aRoot] = bRoot
46
+ this.rank[bRoot]++
47
+ } else if (aRootRank < bRootRank) {
48
+ this.parent[aRoot] = bRoot
49
+ } else {
50
+ this.parent[bRoot] = aRoot
51
+ }
52
+ }
53
+
54
+ find(value: number): number {
55
+ const nodeValue = this.parent[value]
56
+ assert(isntUndefined(nodeValue), 'The value does not belong to any set')
57
+ if (nodeValue === value) return value
58
+
59
+ const parentNode = nodeValue
60
+ const root = this.find(parentNode)
61
+ this.parent[value] = root
62
+ return root
63
+ }
64
+ }
package/src/index.ts CHANGED
@@ -24,3 +24,4 @@ export { DynamicTypedArray } from './dynamic-typed-array.js'
24
24
  export * from './sorted-set.js'
25
25
  export * from './bit-set.js'
26
26
  export * from './typed-bit-set.js'
27
+ export * from './disjoint-set.js'