atomic-fns 0.3.0 → 0.3.2

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.
Files changed (85) hide show
  1. package/.esdoc.json +2 -2
  2. package/README.md +48 -13
  3. package/core/collections/BTree.d.ts +229 -0
  4. package/core/collections/BTree.js +1165 -0
  5. package/core/collections/BTree.ts +1340 -0
  6. package/core/collections/Heap.d.ts +69 -0
  7. package/core/collections/Heap.js +181 -0
  8. package/core/collections/Heap.ts +189 -0
  9. package/core/collections/LRUCache.d.ts +131 -0
  10. package/core/collections/LRUCache.js +388 -0
  11. package/core/collections/LRUCache.ts +465 -0
  12. package/core/collections/SortedMap.d.ts +92 -0
  13. package/core/collections/SortedMap.js +130 -0
  14. package/core/collections/SortedMap.ts +146 -0
  15. package/core/collections/SortedSet.d.ts +63 -0
  16. package/core/collections/SortedSet.js +93 -0
  17. package/core/collections/SortedSet.ts +104 -0
  18. package/core/collections/SortedTree.d.ts +103 -0
  19. package/core/collections/SortedTree.js +141 -0
  20. package/core/collections/SortedTree.ts +160 -0
  21. package/core/collections/SplayTree.d.ts +105 -0
  22. package/core/collections/SplayTree.js +338 -0
  23. package/core/collections/SplayTree.ts +354 -0
  24. package/core/collections/abc.d.ts +152 -0
  25. package/core/collections/abc.js +39 -0
  26. package/core/collections/abc.ts +176 -0
  27. package/core/collections/deque.d.ts +110 -0
  28. package/core/collections/deque.js +285 -0
  29. package/core/collections/deque.ts +329 -0
  30. package/core/collections/frozenset.d.ts +19 -0
  31. package/core/collections/frozenset.js +33 -0
  32. package/core/collections/frozenset.ts +37 -0
  33. package/{src → core}/collections/index.d.ts +12 -161
  34. package/{src → core}/collections/index.js +13 -164
  35. package/{src → core}/collections/index.ts +13 -224
  36. package/core/collections/test.html +10 -0
  37. package/core/collections/typedArrays.d.ts +31 -0
  38. package/core/collections/typedArrays.js +143 -0
  39. package/core/collections/typedArrays.ts +163 -0
  40. package/{src → core}/datetime/index.d.ts +0 -0
  41. package/{src → core}/datetime/index.js +0 -0
  42. package/{src → core}/datetime/index.ts +0 -0
  43. package/core/datetime/test.html +0 -0
  44. package/{src → core}/functools/index.d.ts +2 -2
  45. package/{src → core}/functools/index.js +2 -2
  46. package/{src → core}/functools/index.ts +2 -2
  47. package/{src → core}/globals/index.d.ts +2 -7
  48. package/{src → core}/globals/index.js +5 -2
  49. package/{src → core}/globals/index.ts +6 -9
  50. package/{src → core}/index.d.ts +0 -0
  51. package/{src → core}/index.js +0 -0
  52. package/{src → core}/index.ts +0 -0
  53. package/{src → core}/itertools/index.d.ts +9 -7
  54. package/{src → core}/itertools/index.js +25 -9
  55. package/{src → core}/itertools/index.ts +39 -16
  56. package/{src → core}/math/index.d.ts +0 -0
  57. package/{src → core}/math/index.js +0 -0
  58. package/{src → core}/math/index.ts +0 -0
  59. package/core/operators/index.d.ts +148 -0
  60. package/core/operators/index.js +271 -0
  61. package/core/operators/index.ts +282 -0
  62. package/{src → core}/random/index.d.ts +0 -0
  63. package/{src → core}/random/index.js +0 -0
  64. package/{src → core}/random/index.ts +0 -0
  65. package/package.json +7 -4
  66. package/tests/BTree.spec.ts +143 -0
  67. package/tests/Cache.spec.ts +161 -0
  68. package/tests/Heap.spec.ts +66 -0
  69. package/tests/SortedMap.spec.ts +144 -0
  70. package/tests/SortedSet.spec.ts +84 -0
  71. package/tests/SortedTree.spec.ts +164 -0
  72. package/tests/SplayTree.spec.ts +121 -0
  73. package/tests/collections.spec.ts +1 -1
  74. package/tests/deque.spec.ts +107 -0
  75. package/tests/globals.spec.ts +2 -2
  76. package/tests/itertools.spec.ts +2 -2
  77. package/tests/math.spec.ts +1 -1
  78. package/tests/operators.spec.ts +5 -5
  79. package/tests/random.spec.ts +10 -10
  80. package/tsconfig.json +10 -10
  81. package/tsconfig.node.json +2 -2
  82. package/tsconfig.xo.json +2 -2
  83. package/src/operators/index.d.ts +0 -31
  84. package/src/operators/index.js +0 -171
  85. package/src/operators/index.ts +0 -175
@@ -0,0 +1,143 @@
1
+ import assert from 'assert'
2
+ import { BTree } from '../core/collections/BTree.js'
3
+ import { times } from '../core/itertools/index.js'
4
+
5
+ describe('BTree', () => {
6
+ it('get', () => {
7
+ let tree = new BTree()
8
+
9
+ for (let i = 100; i > 0; i--) {
10
+ tree.set(i, i * 2)
11
+ assert(tree.get(i) == i * 2)
12
+ }
13
+ })
14
+
15
+ it('add', () => {
16
+ let tree = new BTree()
17
+
18
+ for (let i = 100; i > 0; i--) {
19
+ tree.add(i)
20
+ assert(tree.contains(i))
21
+ assert(tree.get(i) === null)
22
+ }
23
+ })
24
+
25
+ it('set', () => {
26
+ let tree = new BTree()
27
+
28
+ for (let i = 100; i > 0; i--) {
29
+ tree.set(i, i)
30
+ assert(tree.contains(i))
31
+ }
32
+
33
+ assert(tree.size === 100)
34
+ })
35
+
36
+ it('remove', () => {
37
+ let tree = new BTree()
38
+ for (let i = 100; i > 0; i--) {
39
+ tree.set(i, i)
40
+ }
41
+ assert(tree.contains(100))
42
+ tree.remove(100)
43
+ assert(tree.contains(100) === false)
44
+ })
45
+
46
+ it('clear', () => {
47
+ let tree = new BTree()
48
+ for (let i = 100; i > 0; i--) {
49
+ tree.set(i, i)
50
+ }
51
+ tree.clear()
52
+ assert(tree.size === 0)
53
+ assert(tree.contains(100) === false)
54
+ })
55
+
56
+ it('iterates in order', () => {
57
+ let tree = new BTree()
58
+ let entries: any[] = []
59
+ for (let i = 9; i >= 0; i--) {
60
+ tree.set(i, i * 2)
61
+ entries.push([i, i * 2])
62
+ }
63
+ entries.sort((x, y) => x[0] - y[0])
64
+ assert.deepEqual([...tree], entries)
65
+ })
66
+
67
+ it('minKey', () => {
68
+ let tree = new BTree()
69
+ let keys: number[] = []
70
+ for (let i = 10; i >= 0; i--) {
71
+ keys.push(i)
72
+ tree.set(i, i * 2)
73
+ }
74
+ keys.sort(tree._compare)
75
+ assert(tree.minKey() === keys[0])
76
+ })
77
+
78
+ it('maxKey', () => {
79
+ let tree = new BTree()
80
+ let keys: number[] = []
81
+ for (let i = 10; i >= 0; i--) {
82
+ keys.push(i)
83
+ tree.set(i, i * 2)
84
+ }
85
+ keys.sort(tree._compare)
86
+ assert(tree.maxKey() === keys[keys.length - 1])
87
+ })
88
+
89
+ it('clone', () => {
90
+ let tree = new BTree()
91
+ let entries: any[] = []
92
+ for (let i = 100; i > 0; i--) {
93
+ tree.set(i, i)
94
+ entries.push([i, i])
95
+ }
96
+ let t2 = tree.clone()
97
+ assert.deepEqual([...t2.reversed()], entries)
98
+ })
99
+
100
+ it('freeze', () => {
101
+ let tree = new BTree()
102
+ for (let i = 10; i > 0; i--) {
103
+ tree.set(i, i)
104
+ }
105
+ tree.freeze()
106
+ assert.throws(tree.clear)
107
+ assert.throws(() => tree.add(11))
108
+ })
109
+
110
+ it('reversed', () => {
111
+ let tree = new BTree()
112
+ let entries: any[] = []
113
+ for (let i = 100; i > 0; i--) {
114
+ tree.set(i, i)
115
+ entries.push([i, i])
116
+ }
117
+ assert.deepEqual([...tree.reversed()], entries)
118
+ })
119
+
120
+ it('keys', () => {
121
+ let tree = new BTree()
122
+ for (let i = 9; i >= 0; i--) {
123
+ tree.set(i, i)
124
+ }
125
+ assert.deepEqual([...tree.keys()], [...times(10, (i) => i)])
126
+ })
127
+
128
+ it('values', () => {
129
+ let tree = new BTree()
130
+ for (let i = 9; i >= 0; i--) {
131
+ tree.set(i, i * 2)
132
+ }
133
+ assert.deepEqual([...tree.values()], [...times(10, (i) => i * 2)])
134
+ })
135
+
136
+ it('entries', () => {
137
+ let tree = new BTree()
138
+ for (let i = 9; i >= 0; i--) {
139
+ tree.set(i, i * 2)
140
+ }
141
+ assert.deepEqual([...tree.entries()], [...times(10, (i) => [i, i * 2])])
142
+ })
143
+ })
@@ -0,0 +1,161 @@
1
+ import assert from 'assert'
2
+ import { Cache, LRUCache } from '../core/collections/LRUCache.js'
3
+
4
+ describe('Cache', () => {
5
+ it('empty', () => {
6
+ let cache = new Cache()
7
+ assert(cache.size === 0)
8
+ })
9
+
10
+ it('contains', () => {
11
+ let cache = new Cache(2)
12
+ assert(cache.capacity === 2)
13
+ assert(!cache.contains(1))
14
+ cache.set(1, 'foo')
15
+ cache.set(2, 'bar')
16
+ assert(cache.contains(1))
17
+ assert(cache.contains(2))
18
+ })
19
+
20
+ it('evicts LRU keys', () => {
21
+ let cache = new Cache(2)
22
+ assert(cache.capacity === 2)
23
+ cache.set(1, 'foo')
24
+ cache.set(2, 'bar')
25
+ assert(cache.get(1) === 'foo')
26
+ cache.set(3, 'other')
27
+ assert(cache.get(2) === undefined)
28
+ assert.deepEqual([...cache.keys()], [3, 1])
29
+ })
30
+
31
+ it('keys', () => {
32
+ let cache = new Cache(5)
33
+ for (const value of [1, 2, 3, 4, 5]) {
34
+ cache.set(value, value)
35
+ }
36
+ assert.deepEqual([...cache.keys()], [5, 4, 3, 2, 1])
37
+ })
38
+
39
+ it('values', () => {
40
+ let cache = new Cache(5)
41
+ for (const value of [1, 2, 3, 4, 5]) {
42
+ cache.set(value, value)
43
+ }
44
+ assert.deepEqual([...cache.keys()], [5, 4, 3, 2, 1])
45
+ })
46
+
47
+ it('entries', () => {
48
+ let cache = new Cache(3)
49
+ for (const value of [1, 2, 3]) {
50
+ cache.set(value, 0)
51
+ }
52
+ assert.deepEqual(
53
+ [...cache.entries()],
54
+ [
55
+ [3, 0],
56
+ [2, 0],
57
+ [1, 0]
58
+ ]
59
+ )
60
+ })
61
+
62
+ it('iterator', () => {
63
+ let cache = new Cache(3)
64
+ for (const value of [1, 2, 3]) {
65
+ cache.set(value, 0)
66
+ }
67
+ let values = [...cache]
68
+ assert.deepEqual(values, [...cache.entries()])
69
+ })
70
+ })
71
+
72
+ describe('LRUCache', () => {
73
+ it('empty', () => {
74
+ let cache = new LRUCache()
75
+ assert(cache.size === 0)
76
+ })
77
+
78
+ it('contains', () => {
79
+ let cache = new LRUCache(2)
80
+ assert(cache.capacity === 2)
81
+ assert(!cache.contains(1))
82
+ cache.set(1, 'foo')
83
+ cache.set(2, 'bar')
84
+ assert(cache.contains(1))
85
+ assert(cache.contains(2))
86
+ })
87
+
88
+ it('evicts LRU keys', () => {
89
+ let cache = new LRUCache(2)
90
+ assert(cache.capacity === 2)
91
+ cache.set(1, 'foo')
92
+ cache.set(2, 'bar')
93
+ assert(cache.get(1) === 'foo')
94
+ cache.set(3, 'other')
95
+ assert(cache.get(2) === undefined)
96
+ assert.deepEqual([...cache.keys()], [3, 1])
97
+ })
98
+
99
+ it('keys', () => {
100
+ let cache = new LRUCache(5)
101
+ for (const value of [1, 2, 3, 4, 5]) {
102
+ cache.set(value, value)
103
+ }
104
+ assert.deepEqual([...cache.keys()], [5, 4, 3, 2, 1])
105
+ })
106
+
107
+ it('values', () => {
108
+ let cache = new LRUCache(5)
109
+ for (const value of [1, 2, 3, 4, 5]) {
110
+ cache.set(value, value)
111
+ }
112
+ assert.deepEqual([...cache.keys()], [5, 4, 3, 2, 1])
113
+ })
114
+
115
+ it('entries', () => {
116
+ let cache = new LRUCache(3)
117
+ for (const value of [1, 2, 3]) {
118
+ cache.set(value, 0)
119
+ }
120
+ assert.deepEqual(
121
+ [...cache.entries()],
122
+ [
123
+ [3, 0],
124
+ [2, 0],
125
+ [1, 0]
126
+ ]
127
+ )
128
+ })
129
+
130
+ it('iterator', () => {
131
+ let cache = new LRUCache(3)
132
+ for (const value of [1, 2, 3]) {
133
+ cache.set(value, 0)
134
+ }
135
+ let values = [...cache]
136
+ assert.deepEqual(values, [...cache.entries()])
137
+ })
138
+
139
+ it('delete', () => {
140
+ let cache = new LRUCache()
141
+ for (const value of [1, 2, 3]) {
142
+ cache.set(value, 0)
143
+ }
144
+ assert(cache.contains(1))
145
+ assert(cache.delete(1) === true)
146
+ assert(!cache.contains(1))
147
+ // try deleting again
148
+ assert(cache.delete(1) === false)
149
+ })
150
+
151
+ it('remove', () => {
152
+ let cache = new LRUCache()
153
+ for (const value of [1, 2, 3]) {
154
+ cache.set(value, 0)
155
+ }
156
+ assert(cache.contains(1))
157
+ assert(cache.remove(1) === 0)
158
+ assert(!cache.contains(1))
159
+ assert(cache.delete(2))
160
+ })
161
+ })
@@ -0,0 +1,66 @@
1
+ import assert from 'assert'
2
+ import { Heap } from '../core/collections/Heap.js'
3
+ import { sorted } from '../core/itertools/index.js'
4
+
5
+ describe('Heap', () => {
6
+ it('empty', () => {
7
+ let h = new Heap()
8
+ assert(h.empty())
9
+ })
10
+
11
+ it('heapifies array', () => {
12
+ let arr = [7, 9, 3, 5, 8, 1, 2, 6, 4]
13
+ let h = new Heap(arr)
14
+ assert.deepEqual([...h.values()], arr)
15
+ for (const x of sorted(arr)) {
16
+ assert(h.contains(x))
17
+ assert(h.pop() === x)
18
+ }
19
+ })
20
+
21
+ it('max heapifies', () => {
22
+ let arr = [7, 9, 3, 5, 8, 1, 2, 6, 4]
23
+ let h = new Heap(arr, (x, y) => {
24
+ if (x > y) return -1
25
+ if (x < y) return 1
26
+ return 0
27
+ })
28
+ assert.deepEqual([...h.values()], arr)
29
+ for (const x of sorted(arr, true)) {
30
+ assert(h.contains(x))
31
+ assert(h.pop() === x)
32
+ }
33
+ })
34
+
35
+ it('add', () => {
36
+ let h = new Heap()
37
+ let arr = [7, 9, 3, 5, 8, 1, 2, 6, 4]
38
+ for (const value of arr) {
39
+ h.add(value)
40
+ assert(h.contains(value))
41
+ }
42
+ assert(h.size === arr.length)
43
+ })
44
+
45
+ it('pop', () => {
46
+ let h = new Heap()
47
+ let arr = [7, 9, 3, 5, 8, 1, 2, 6, 4]
48
+ for (const value of arr) {
49
+ h.add(value)
50
+ }
51
+ assert(h.pop() === 1)
52
+ assert(h.size === arr.length - 1)
53
+ assert(h.pop() === 2)
54
+ })
55
+
56
+ it('remove', () => {
57
+ let h = new Heap()
58
+ let arr = [7, 9, 3, 5, 8, 1, 2, 6, 4]
59
+ for (const value of arr) {
60
+ h.add(value)
61
+ }
62
+ assert(h.pop() === 1)
63
+ assert(h.size === arr.length - 1)
64
+ assert(h.pop() === 2)
65
+ })
66
+ })
@@ -0,0 +1,144 @@
1
+ import assert from 'assert'
2
+ import { SortedMap } from '../core/collections/SortedMap.js'
3
+
4
+ describe('SortedMap', () => {
5
+ it('empty', () => {
6
+ let tree = new SortedMap()
7
+ assert(tree.empty())
8
+ assert(tree.size === 0)
9
+ })
10
+
11
+ it('initialized', () => {
12
+ let entries: Array<[number, number]> = [
13
+ [5, 5],
14
+ [4, 4],
15
+ [3, 3],
16
+ [1, 1],
17
+ [2, 2]
18
+ ]
19
+ let tree = new SortedMap(entries)
20
+ assert(!tree.empty())
21
+ assert(tree.size === 5)
22
+ entries.sort((x, y) => x[0] - y[0])
23
+ assert.deepEqual(
24
+ [...tree.keys()],
25
+ entries.map((x) => x[0])
26
+ )
27
+ })
28
+
29
+ it('add', () => {
30
+ let tree = new SortedMap()
31
+ for (let i = 10; i > 0; i--) {
32
+ tree.add(i)
33
+ assert(tree.get(i) === null)
34
+ assert(tree.contains(i))
35
+ }
36
+ assert(tree.size === 10)
37
+ })
38
+
39
+ it('set', () => {
40
+ let tree = new SortedMap()
41
+ for (let i = 10; i > 0; i--) {
42
+ tree.set(i, i)
43
+ assert(tree.get(i) === i)
44
+ assert(tree.contains(i))
45
+ }
46
+ // update a key
47
+ tree.set(1, 42)
48
+ assert(tree.get(1) === 42)
49
+ // adds if not exists
50
+ tree.set(0, 42)
51
+ assert(tree.size === 11)
52
+ })
53
+
54
+ it('get', () => {
55
+ let tree = new SortedMap()
56
+ for (let i = 10; i > 0; i--) {
57
+ tree.set(i, i)
58
+ assert(tree.get(i) === i)
59
+ assert(tree.contains(i))
60
+ }
61
+ assert(tree.size === 10)
62
+ })
63
+
64
+ it('has', () => {
65
+ let tree = new SortedMap()
66
+ for (let i = 100; i > 0; i--) {
67
+ tree.add(i)
68
+ assert(tree.has(i))
69
+ }
70
+ assert(tree.size === 100)
71
+ })
72
+
73
+ it('min', () => {
74
+ let tree = new SortedMap()
75
+ for (let i = 10; i > 0; i--) {
76
+ tree.add(i)
77
+ }
78
+ assert(tree.min() === 1)
79
+ })
80
+
81
+ it('max', () => {
82
+ let tree = new SortedMap()
83
+ for (let i = 10; i > 0; i--) {
84
+ tree.add(i)
85
+ }
86
+ assert(tree.max() === 10)
87
+ })
88
+
89
+ it('delete', () => {
90
+ let tree = new SortedMap()
91
+ tree.add(42)
92
+ assert(tree.contains(42))
93
+ assert(tree.delete(42) === true)
94
+ assert(!tree.contains(42))
95
+ assert(tree.delete(42) === false)
96
+ })
97
+
98
+ it('clear', () => {
99
+ let tree = new SortedMap()
100
+ for (let i = 1; i <= 5; i++) {
101
+ tree.add(i)
102
+ assert(tree.contains(i))
103
+ }
104
+ tree.clear()
105
+ assert(tree.empty())
106
+ assert(tree.size === 0)
107
+ for (let i = 1; i <= 5; i++) {
108
+ assert(!tree.contains(i))
109
+ }
110
+ })
111
+
112
+ it('keys', () => {
113
+ let tree = new SortedMap()
114
+ for (let i = 1; i <= 5; i++) {
115
+ tree.set(i, i * 2)
116
+ }
117
+ assert.deepEqual([...tree.keys()], [1, 2, 3, 4, 5])
118
+ })
119
+
120
+ it('values', () => {
121
+ let tree = new SortedMap()
122
+ for (let i = 1; i <= 5; i++) {
123
+ tree.set(i, i * 2)
124
+ }
125
+ assert.deepEqual([...tree.values()], [2, 4, 6, 8, 10])
126
+ })
127
+
128
+ it('entries', () => {
129
+ let tree = new SortedMap()
130
+ for (let i = 1; i <= 5; i++) {
131
+ tree.set(i, i * 2)
132
+ }
133
+ assert.deepEqual(
134
+ [...tree.entries()],
135
+ [
136
+ [1, 2],
137
+ [2, 4],
138
+ [3, 6],
139
+ [4, 8],
140
+ [5, 10]
141
+ ]
142
+ )
143
+ })
144
+ })
@@ -0,0 +1,84 @@
1
+ import assert from 'assert'
2
+ import { SortedSet } from '../core/collections/SortedSet.js'
3
+
4
+ describe('SortedSet', () => {
5
+ it('empty', () => {
6
+ let tree = new SortedSet()
7
+ assert(tree.empty())
8
+ assert(tree.size === 0)
9
+ })
10
+
11
+ it('initialized', () => {
12
+ let entries: number[] = [5, 4, 3, 1, 2]
13
+ let tree = new SortedSet(entries)
14
+ assert(!tree.empty())
15
+ assert(tree.size === 5)
16
+ entries.sort()
17
+ assert.deepEqual([...tree.values()], entries)
18
+ })
19
+
20
+ it('add', () => {
21
+ let tree = new SortedSet()
22
+ for (let i = 10; i > 0; i--) {
23
+ tree.add(i)
24
+ assert(tree.contains(i))
25
+ }
26
+ assert(tree.size === 10)
27
+ })
28
+
29
+ it('has', () => {
30
+ let tree = new SortedSet()
31
+ for (let i = 100; i > 0; i--) {
32
+ tree.add(i)
33
+ assert(tree.has(i))
34
+ }
35
+ assert(tree.size === 100)
36
+ })
37
+
38
+ it('min', () => {
39
+ let tree = new SortedSet()
40
+ for (let i = 10; i > 0; i--) {
41
+ tree.add(i)
42
+ }
43
+ assert(tree.min() === 1)
44
+ })
45
+
46
+ it('max', () => {
47
+ let tree = new SortedSet()
48
+ for (let i = 10; i > 0; i--) {
49
+ tree.add(i)
50
+ }
51
+ assert(tree.max() === 10)
52
+ })
53
+
54
+ it('delete', () => {
55
+ let tree = new SortedSet()
56
+ tree.add(42)
57
+ assert(tree.contains(42))
58
+ assert(tree.delete(42) === true)
59
+ assert(!tree.contains(42))
60
+ assert(tree.delete(42) === false)
61
+ })
62
+
63
+ it('clear', () => {
64
+ let tree = new SortedSet()
65
+ for (let i = 1; i <= 5; i++) {
66
+ tree.add(i)
67
+ assert(tree.contains(i))
68
+ }
69
+ tree.clear()
70
+ assert(tree.empty())
71
+ assert(tree.size === 0)
72
+ for (let i = 1; i <= 5; i++) {
73
+ assert(!tree.contains(i))
74
+ }
75
+ })
76
+
77
+ it('values', () => {
78
+ let tree = new SortedSet()
79
+ for (let i = 1; i <= 5; i++) {
80
+ tree.add(i * 2)
81
+ }
82
+ assert.deepEqual([...tree.values()], [2, 4, 6, 8, 10])
83
+ })
84
+ })