functionalscript 0.0.285 → 0.0.289

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.285",
3
+ "version": "0.0.289",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -54,6 +54,18 @@ const seq = require('../list')
54
54
 
55
55
  /** @typedef {0|1|2|3|4} Index5 */
56
56
 
57
+ /**
58
+ * @template T
59
+ * @typedef {T extends Array1<infer _> ? Index1 :
60
+ * T extends Array2<infer _> ? Index2 :
61
+ * T extends Array3<infer _> ? Index3 :
62
+ * T extends Array4<infer _> ? Index4 :
63
+ * T extends Array5<infer _> ? Index5 :
64
+ * T extends readonly (infer _)[] ? number :
65
+ * never
66
+ * } KeyOf
67
+ */
68
+
57
69
  /** @type {<T>(_: readonly T[]) => readonly T[]} */
58
70
  const uncheckTail = a => a.slice(1)
59
71
 
@@ -118,12 +118,12 @@ Posible actions:
118
118
  | | | |`[[v1],v20,[v21]]` |
119
119
  | | |`[nR0]`|`[[nR0, v1, n20, v21, n22]]` |
120
120
  | | | |`[[nR0, v1, n20], v21, [n22, v23, n23]]`|
121
- | | |`nR` |`[r,v1,n2]` |
121
+ | | |`nR` |`[nR,v1,n2]` |
122
122
  | | 2|`[]` |`[[v00, v1]]` |
123
123
  | | | |`[[v00],v01,[v1]]` |
124
124
  | | |`[nR0]`|`[[n00, v01, n02, v1, nR0]]` |
125
125
  | | | |`[[n00, v01, n02], v02, [n03, v1, nR0]]`|
126
- | | |`nR` |`[n0,v1,r]` |
126
+ | | |`nR` |`[n0,v1,nR]` |
127
127
  |`[n0,v1,n2,v3,n4]`| 0|`[]` |`[[v1,v20],v3,n4]` |
128
128
  | | | |`[[v1],v20,[v21],v3,n4]` |
129
129
  | | |`[nR0]`|`[[nR0,v1,n20,v21,n22],v3,n4]` |
@@ -1,11 +1,11 @@
1
1
  const _ = require('..')
2
- const { todo } = require('../../../dev')
3
2
  const list = require('../../list')
4
3
  const cmp = require('../../function/compare')
4
+ const array = require('../../array')
5
5
 
6
6
  /**
7
7
  * @template T
8
- * @typedef {readonly[cmp.Index3, _.Leaf1<T>|_.Branch3<T>]} FirstLeaf1
8
+ * @typedef {readonly[cmp.Index3, _.Leaf1<T>]} FirstLeaf1
9
9
  */
10
10
 
11
11
  /**
@@ -56,7 +56,10 @@ const child = item => {
56
56
 
57
57
  /**
58
58
  * @template T
59
- * @typedef {readonly[First<T>, Path<T>]} Result<T>
59
+ * @typedef {{
60
+ * readonly first: First<T>,
61
+ * readonly tail: Path<T>
62
+ * }} Result<T>
60
63
  */
61
64
 
62
65
  /** @type {<T>(c: cmp.Compare<T>) => (node: _.Node<T>) => Result<T>} */
@@ -66,23 +69,28 @@ const find = c => {
66
69
  /** @typedef {typeof c extends cmp.Compare<infer T> ? T : never} T */
67
70
  /** @type {(prior: Path<T>) => (node: _.Node<T>) => Result<T>} */
68
71
  const f = tail => node => {
69
- /** @type {(first: PathItem<T>) => Result<T>} */
70
- const append = first => f({ first, tail })(child(first))
72
+ /** @type {(index: array.KeyOf<typeof node>) => Result<T>} */
73
+ const append = index => {
74
+ const first = /** @type {PathItem<T>} */([index, node])
75
+ return f({ first, tail })(child(first))
76
+ }
77
+ /** @type {(index: array.KeyOf<typeof node>) => Result<T>} */
78
+ const done = index => ({ first: /** @type {First<T>} */([index, node]), tail })
71
79
  switch (node.length) {
72
- case 1: { return [[i3(node[0]), node], tail] }
73
- case 2: { return [[i5(node), node], tail] }
80
+ case 1: { return done(i3(node[0])) }
81
+ case 2: { return done(i5(node)) }
74
82
  case 3: {
75
83
  const i = i3(node[1])
76
84
  switch (i) {
77
- case 0: case 2: { return append([i, node]) }
78
- case 1: { return [[i, node], tail] }
85
+ case 0: case 2: { return append(i) }
86
+ case 1: { return done(i) }
79
87
  }
80
88
  }
81
89
  case 5: {
82
90
  const i = i5([node[1], node[3]])
83
91
  switch (i) {
84
- case 0: case 2: case 4: { return append([i, node]) }
85
- case 1: case 3: { return [[i, node], tail]}
92
+ case 0: case 2: case 4: { return append(i) }
93
+ case 1: case 3: { return done(i) }
86
94
  }
87
95
  }
88
96
  }
@@ -7,9 +7,6 @@ const { stringCmp } = require('../../function/compare')
7
7
 
8
8
  const jsonStr = json.stringify(sort)
9
9
 
10
- // /** @type {(sequence: list.List<json.Unknown>) => string} */
11
- // const arrayStr = sequence => jsonStr(list.toArray(sequence))
12
-
13
10
  /** @type {(node: btree.Node<string>) => (value: string) => btree.Node<string>} */
14
11
  const set = node => value => {
15
12
  const result = btree.setVisitor(stringCmp(value))(node)(() => value)
@@ -20,7 +17,7 @@ const set = node => value => {
20
17
  }
21
18
 
22
19
  /** @type {(r: _.Result<json.Unknown>) => string} */
23
- const str = ([r, path]) => jsonStr([r[0], list.toArray(list.map(x => x[0])(path))])
20
+ const str = r => jsonStr(list.toArray(list.map(x => x[0])(r)))
24
21
 
25
22
  /** @type {(i: string) => (m: btree.Node<string>) => string} */
26
23
  const find = i => m => str(_.find(stringCmp(i))(m))
@@ -37,86 +34,86 @@ const find = i => m => str(_.find(stringCmp(i))(m))
37
34
  //
38
35
  {
39
36
  const r = find("0")(_map)
40
- if (r !== '[0,[0,0]]') { throw r }
37
+ if (r !== '[0,0,0]') { throw r }
41
38
  }
42
39
  {
43
40
  const r = find("1")(_map)
44
- if (r !== '[1,[0,0]]') { throw r }
41
+ if (r !== '[1,0,0]') { throw r }
45
42
  }
46
43
  {
47
44
  const r = find("10")(_map)
48
- if (r !== '[2,[0,0]]') { throw r }
45
+ if (r !== '[2,0,0]') { throw r }
49
46
  }
50
47
  {
51
48
  const r = find("100")(_map)
52
- if (r !== '[3,[0,0]]') { throw r }
49
+ if (r !== '[3,0,0]') { throw r }
53
50
  }
54
51
  {
55
52
  const r = find("12")(_map)
56
- if (r !== '[4,[0,0]]') { throw r }
53
+ if (r !== '[4,0,0]') { throw r }
57
54
  }
58
55
  {
59
56
  const r = find("16")(_map)
60
- if (r !== '[1,[0]]') { throw r }
57
+ if (r !== '[1,0]') { throw r }
61
58
  }
62
59
  {
63
60
  const r = find("17")(_map)
64
- if (r !== '[0,[2,0]]') { throw r }
61
+ if (r !== '[0,2,0]') { throw r }
65
62
  }
66
63
  {
67
64
  const r = find("25")(_map)
68
- if (r !== '[1,[2,0]]') { throw r }
65
+ if (r !== '[1,2,0]') { throw r }
69
66
  }
70
67
  {
71
68
  const r = find("26")(_map)
72
- if (r !== '[2,[2,0]]') { throw r }
69
+ if (r !== '[2,2,0]') { throw r }
73
70
  }
74
71
  {
75
72
  const r = find("36")(_map)
76
- if (r !== '[3,[2,0]]') { throw r }
73
+ if (r !== '[3,2,0]') { throw r }
77
74
  }
78
75
  {
79
76
  const r = find("37")(_map)
80
- if (r !== '[4,[2,0]]') { throw r }
77
+ if (r !== '[4,2,0]') { throw r }
81
78
  }
82
79
  {
83
80
  const r = find("4")(_map)
84
- if (r !== '[1,[]]') { throw r }
81
+ if (r !== '[1]') { throw r }
85
82
  }
86
83
  {
87
84
  const r = find("41")(_map)
88
- if (r !== '[0,[0,2]]') { throw r }
85
+ if (r !== '[0,0,2]') { throw r }
89
86
  }
90
87
  {
91
88
  const r = find("49")(_map)
92
- if (r !== '[1,[0,2]]') { throw r }
89
+ if (r !== '[1,0,2]') { throw r }
93
90
  }
94
91
  {
95
92
  const r = find("5")(_map)
96
- if (r !== '[2,[0,2]]') { throw r }
93
+ if (r !== '[2,0,2]') { throw r }
97
94
  }
98
95
  {
99
96
  const r = find("64")(_map)
100
- if (r !== '[1,[2]]') { throw r }
97
+ if (r !== '[1,2]') { throw r }
101
98
  }
102
99
  {
103
100
  const r = find("65")(_map)
104
- if (r !== '[0,[2,2]]') { throw r }
101
+ if (r !== '[0,2,2]') { throw r }
105
102
  }
106
103
  {
107
104
  const r = find("81")(_map)
108
- if (r !== '[1,[2,2]]') { throw r }
105
+ if (r !== '[1,2,2]') { throw r }
109
106
  }
110
107
  {
111
108
  const r = find("85")(_map)
112
- if (r !== '[2,[2,2]]') { throw r }
109
+ if (r !== '[2,2,2]') { throw r }
113
110
  }
114
111
  {
115
112
  const r = find("9")(_map)
116
- if (r !== '[3,[2,2]]') { throw r }
113
+ if (r !== '[3,2,2]') { throw r }
117
114
  }
118
115
  {
119
116
  const r = find("91")(_map)
120
- if (r !== '[4,[2,2]]') { throw r }
117
+ if (r !== '[4,2,2]') { throw r }
121
118
  }
122
119
  }
@@ -0,0 +1,93 @@
1
+ const _ = require('..')
2
+ const find = require('../find')
3
+ const cmp = require('../../function/compare')
4
+ const list = require('../../list')
5
+
6
+ /**
7
+ * @template T
8
+ * @typedef {_.Branch1<T> | _.Branch3<T>} Result
9
+ */
10
+
11
+ /** @type {<T>(b: _.Branch5<T> | _.Branch7<T>) => Result<T>} */
12
+ const b57 = b => b.length === 5 ? [b] : [[b[0], b[1], b[2]], b[3], [b[4], b[5], b[6]]]
13
+
14
+ /** @type {<T>(a: Result<T>) => (i: find.PathItem<T>) => Result<T>} */
15
+ const reduce = a => i => {
16
+ switch (i[0]) {
17
+ case 0: {
18
+ const x = i[1]
19
+ switch (x.length) {
20
+ case 3: { return [[...a, x[1], x[2]]] }
21
+ case 5: { return b57([...a, x[1], x[2], x[3], x[4]]) }
22
+ }
23
+ }
24
+ case 2: {
25
+ const x = i[1]
26
+ switch (x.length) {
27
+ case 3: { return [[x[0], x[1], ...a]] }
28
+ case 5: { return b57([x[0], x[1], ...a, x[3], x[4]]) }
29
+ }
30
+ }
31
+ case 4: {
32
+ const x = i[1]
33
+ return b57([x[0], x[1], x[2], x[3], ...a])
34
+ }
35
+ }
36
+ }
37
+
38
+ /** @type {<T>(c: cmp.Compare<T>) => (value: T) => (node: _.Node<T>) => _.Node<T>} */
39
+ const set = c => value => node => {
40
+ const { first, tail } = find.find(c)(node)
41
+ /** @typedef {typeof value} T */
42
+ /** @type {() => Result<T>} */
43
+ const f = () => {
44
+ switch (first[0]) {
45
+ case 0: {
46
+ // insert
47
+ const x = first[1]
48
+ switch (x.length) {
49
+ case 1: { return [[value, x[0]]] }
50
+ case 2: { return [[value], x[0], [x[1]]] }
51
+ }
52
+ }
53
+ case 1: {
54
+ // replace
55
+ const x = first[1];
56
+ switch (x.length) {
57
+ case 1: { return [[value]] }
58
+ case 2: { return [[value, x[1]]] }
59
+ case 3: { return [[x[0], value, x[2]]] }
60
+ case 5: { return [[x[0], value, x[2], x[3], x[4]]] }
61
+ }
62
+ }
63
+ case 2: {
64
+ // insert
65
+ const x = first[1];
66
+ switch (x.length) {
67
+ case 1: { return [[x[0], value]] }
68
+ case 2: { return [[x[0]], value, [x[1]]] }
69
+ }
70
+ }
71
+ case 3: {
72
+ // replace
73
+ const x = first[1];
74
+ switch (x.length) {
75
+ case 2: { return [[x[0], value]] }
76
+ case 5: { return [[x[0], x[1], x[2], value, x[4]]]}
77
+ }
78
+ }
79
+ case 4: {
80
+ // insert
81
+ const [v0, v1] = first[1];
82
+ return [[v0], v1, [value]]
83
+ }
84
+ }
85
+ }
86
+ const r = list.reduce(reduce)(f())(tail)
87
+ return r.length === 1 ? r[0] : r
88
+ }
89
+
90
+ module.exports = {
91
+ /** @readonly */
92
+ set,
93
+ }
@@ -0,0 +1,379 @@
1
+ const _ = require('.')
2
+ const btree = require('..')
3
+ const { stringCmp } = require('../../function/compare')
4
+ const json = require('../../../json')
5
+ const { sort } = require('../../object')
6
+
7
+ /** @type {(node: btree.Node<string>) => (value: string) => btree.Node<string>} */
8
+ const set = node => value => _.set(stringCmp(value))(value)(node)
9
+
10
+ const jsonStr = json.stringify(sort)
11
+
12
+ {
13
+ /** @type {btree.Node<string>} */
14
+ let _map = ['1']
15
+ for (let i = 2; i <= 10; i++)
16
+ _map = set(_map)((i * i).toString())
17
+ const r = jsonStr(_map)
18
+ if (r !== '[[["1","100"],"16",["25","36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
19
+ }
20
+
21
+ {
22
+ /** @type {btree.Node<string>} */
23
+ let _map = ['1']
24
+ for (let i = 2; i <= 11; i++)
25
+ _map = set(_map)((i * i).toString())
26
+ const r = jsonStr(_map)
27
+ if (r !== '[[["1"],"100",["121"],"16",["25","36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
28
+ }
29
+
30
+ {
31
+ /** @type {btree.Node<string>} */
32
+ let _map = ['1']
33
+ for (let i = 2; i <= 12; i++)
34
+ _map = set(_map)((i * i).toString())
35
+ const r = jsonStr(_map)
36
+ if (r !== '[[["1"],"100",["121","144"],"16",["25","36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
37
+ }
38
+
39
+ {
40
+ /** @type {btree.Node<string>} */
41
+ let _map = ['1']
42
+ for (let i = 2; i <= 13; i++)
43
+ _map = set(_map)((i * i).toString())
44
+ const r = jsonStr(_map)
45
+ if (r !== '[[["1"],"100",["121","144"]],"16",[["169"],"25",["36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
46
+ }
47
+
48
+ {
49
+ /** @type {btree.Node<string>} */
50
+ let _map = ['1']
51
+ for (let i = 2; i <= 14; i++)
52
+ _map = set(_map)((i * i).toString())
53
+ const r = jsonStr(_map)
54
+ if (r !== '[[["1"],"100",["121","144"]],"16",[["169","196"],"25",["36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
55
+ }
56
+
57
+ {
58
+ /** @type {btree.Node<string>} */
59
+ let _map = ['1']
60
+ for (let i = 2; i <= 15; i++)
61
+ _map = set(_map)((i * i).toString())
62
+ const r = jsonStr(_map)
63
+ if (r !== '[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"],"25",["36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
64
+ }
65
+
66
+ {
67
+ /** @type {btree.Node<string>} */
68
+ let _map = ['1']
69
+ for (let i = 2; i <= 16; i++)
70
+ _map = set(_map)((i * i).toString())
71
+ const r = jsonStr(_map)
72
+ if (r !== '[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"],"25",["256","36"]],"4",[["49"],"64",["81","9"]]]') { throw r }
73
+ }
74
+
75
+ {
76
+ /** @type {btree.Node<string>} */
77
+ let _map = ['1']
78
+ for (let i = 2; i <= 17; i++)
79
+ _map = set(_map)((i * i).toString())
80
+ const r = jsonStr(_map)
81
+ if (r !== '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],"25",[[["256"],"289",["36"]],"4",[["49"],"64",["81","9"]]]]') { throw r }
82
+ }
83
+
84
+ {
85
+ /** @type {btree.Node<string>} */
86
+ let _map = ['1']
87
+ for (let i = 2; i <= 18; i++)
88
+ _map = set(_map)((i * i).toString())
89
+ const r = jsonStr(_map)
90
+ if (r !==
91
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],"25",[[["256"],"289",["324","36"]],"4",[["49"],"64",["81","9"]]]]'
92
+ ) { throw r }
93
+ }
94
+
95
+ {
96
+ /** @type {btree.Node<string>} */
97
+ let _map = ['1']
98
+ for (let i = 2; i <= 19; i++)
99
+ _map = set(_map)((i * i).toString())
100
+ const r = jsonStr(_map)
101
+ if (r !==
102
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],"25",[[["256"],"289",["324"],"36",["361"]],"4",[["49"],"64",["81","9"]]]]'
103
+ ) { throw r }
104
+ }
105
+
106
+ {
107
+ /** @type {btree.Node<string>} */
108
+ let _map = ['1']
109
+ for (let i = 2; i <= 20; i++)
110
+ _map = set(_map)((i * i).toString())
111
+ const r = jsonStr(_map)
112
+ if (r !==
113
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
114
+ '"25",' +
115
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400","49"],"64",["81","9"]]]]'
116
+ ) { throw r }
117
+ }
118
+
119
+ {
120
+ /** @type {btree.Node<string>} */
121
+ let _map = ['1']
122
+ for (let i = 2; i <= 21; i++)
123
+ _map = set(_map)((i * i).toString())
124
+ const r = jsonStr(_map)
125
+ if (r !==
126
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
127
+ '"25",' +
128
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["49"],"64",["81","9"]]]]'
129
+ ) { throw r }
130
+ }
131
+
132
+ {
133
+ /** @type {btree.Node<string>} */
134
+ let _map = ['1']
135
+ for (let i = 2; i <= 22; i++)
136
+ _map = set(_map)((i * i).toString())
137
+ const r = jsonStr(_map)
138
+ if (r !==
139
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
140
+ '"25",' +
141
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484","49"],"64",["81","9"]]]]'
142
+ ) { throw r }
143
+ }
144
+
145
+ {
146
+ /** @type {btree.Node<string>} */
147
+ let _map = ['1']
148
+ for (let i = 2; i <= 23; i++)
149
+ _map = set(_map)((i * i).toString())
150
+ const r = jsonStr(_map)
151
+ if (r !==
152
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
153
+ '"25",' +
154
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]],"49",[["529"],"64",["81","9"]]]]'
155
+ ) { throw r }
156
+ }
157
+
158
+ {
159
+ /** @type {btree.Node<string>} */
160
+ let _map = ['1']
161
+ for (let i = 2; i <= 24; i++)
162
+ _map = set(_map)((i * i).toString())
163
+ const r = jsonStr(_map)
164
+ if (r !==
165
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
166
+ '"25",' +
167
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]],"49",[["529","576"],"64",["81","9"]]]]'
168
+ ) { throw r }
169
+ }
170
+
171
+ {
172
+ /** @type {btree.Node<string>} */
173
+ let _map = ['1']
174
+ for (let i = 2; i <= 25; i++)
175
+ _map = set(_map)((i * i).toString())
176
+ const r = jsonStr(_map)
177
+ if (r !==
178
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
179
+ '"25",' +
180
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]],"49",[["529"],"576",["625"],"64",["81","9"]]]]'
181
+ ) { throw r }
182
+ }
183
+
184
+ {
185
+ /** @type {btree.Node<string>} */
186
+ let _map = ['1']
187
+ for (let i = 2; i <= 26; i++)
188
+ _map = set(_map)((i * i).toString())
189
+ const r = jsonStr(_map)
190
+ if (r !==
191
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
192
+ '"25",' +
193
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
194
+ '"49",' +
195
+ '[[["529"],"576",["625"]],"64",[["676"],"81",["9"]]]]'
196
+ ) { throw r }
197
+ }
198
+
199
+ {
200
+ /** @type {btree.Node<string>} */
201
+ let _map = ['1']
202
+ for (let i = 2; i <= 27; i++)
203
+ _map = set(_map)((i * i).toString())
204
+ const r = jsonStr(_map)
205
+ if (r !==
206
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
207
+ '"25",' +
208
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
209
+ '"49",' +
210
+ '[[["529"],"576",["625"]],"64",[["676","729"],"81",["9"]]]]'
211
+ ) { throw r }
212
+ }
213
+
214
+ {
215
+ /** @type {btree.Node<string>} */
216
+ let _map = ['1']
217
+ for (let i = 2; i <= 28; i++)
218
+ _map = set(_map)((i * i).toString())
219
+ const r = jsonStr(_map)
220
+ if (r !==
221
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
222
+ '"25",' +
223
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
224
+ '"49",' +
225
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"],"81",["9"]]]]'
226
+ ) { throw r }
227
+ }
228
+
229
+ {
230
+ /** @type {btree.Node<string>} */
231
+ let _map = ['1']
232
+ for (let i = 2; i <= 29; i++)
233
+ _map = set(_map)((i * i).toString())
234
+ const r = jsonStr(_map)
235
+ if (r !==
236
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
237
+ '"25",' +
238
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
239
+ '"49",' +
240
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"],"81",["841","9"]]]]'
241
+ ) { throw r }
242
+ }
243
+
244
+ {
245
+ /** @type {btree.Node<string>} */
246
+ let _map = ['1']
247
+ for (let i = 2; i <= 30; i++)
248
+ _map = set(_map)((i * i).toString())
249
+ const r = jsonStr(_map)
250
+ if (r !==
251
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
252
+ '"25",' +
253
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
254
+ '"49",' +
255
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900"]]]]'
256
+ ) { throw r }
257
+ }
258
+
259
+ {
260
+ /** @type {btree.Node<string>} */
261
+ let _map = ['1']
262
+ for (let i = 2; i <= 31; i++)
263
+ _map = set(_map)((i * i).toString())
264
+ const r = jsonStr(_map)
265
+ if (r !==
266
+ '[[[["1"],"100",["121","144"]],"16",[["169"],"196",["225"]]],' +
267
+ '"25",' +
268
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
269
+ '"49",' +
270
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
271
+ ) { throw r }
272
+ }
273
+
274
+ {
275
+ /** @type {btree.Node<string>} */
276
+ let _map = ['1']
277
+ for (let i = 2; i <= 32; i++)
278
+ _map = set(_map)((i * i).toString())
279
+ const r = jsonStr(_map)
280
+ if (r !==
281
+ '[[[["1"],"100",["1024"],"121",["144"]],"16",[["169"],"196",["225"]]],' +
282
+ '"25",' +
283
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
284
+ '"49",' +
285
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
286
+ ) { throw r }
287
+ }
288
+
289
+ {
290
+ /** @type {btree.Node<string>} */
291
+ let _map = ['1']
292
+ for (let i = 2; i <= 33; i++)
293
+ _map = set(_map)((i * i).toString())
294
+ const r = jsonStr(_map)
295
+ if (r !==
296
+ '[[[["1"],"100",["1024","1089"],"121",["144"]],"16",[["169"],"196",["225"]]],' +
297
+ '"25",' +
298
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
299
+ '"49",' +
300
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
301
+ ) { throw r }
302
+ }
303
+
304
+ {
305
+ /** @type {btree.Node<string>} */
306
+ let _map = ['1']
307
+ for (let i = 2; i <= 34; i++)
308
+ _map = set(_map)((i * i).toString())
309
+ const r = jsonStr(_map)
310
+ if (r !==
311
+ '[[[["1"],"100",["1024"]],"1089",[["1156"],"121",["144"]],"16",[["169"],"196",["225"]]],' +
312
+ '"25",' +
313
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
314
+ '"49",' +
315
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
316
+ ) { throw r }
317
+ }
318
+
319
+ {
320
+ /** @type {btree.Node<string>} */
321
+ let _map = ['1']
322
+ for (let i = 2; i <= 35; i++)
323
+ _map = set(_map)((i * i).toString())
324
+ const r = jsonStr(_map)
325
+ if (r !==
326
+ '[[[["1"],"100",["1024"]],"1089",[["1156"],"121",["1225","144"]],"16",[["169"],"196",["225"]]],' +
327
+ '"25",' +
328
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
329
+ '"49",' +
330
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
331
+ ) { throw r }
332
+ }
333
+
334
+ {
335
+ /** @type {btree.Node<string>} */
336
+ let _map = ['1']
337
+ for (let i = 2; i <= 36; i++)
338
+ _map = set(_map)((i * i).toString())
339
+ const r = jsonStr(_map)
340
+ if (r !==
341
+ '[[[["1"],"100",["1024"]],"1089",[["1156"],"121",["1225"],"1296",["144"]],"16",[["169"],"196",["225"]]],' +
342
+ '"25",' +
343
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
344
+ '"49",' +
345
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
346
+ ) { throw r }
347
+ }
348
+
349
+ {
350
+ /** @type {btree.Node<string>} */
351
+ let _map = ['1']
352
+ for (let i = 2; i <= 37; i++)
353
+ _map = set(_map)((i * i).toString())
354
+ const r = jsonStr(_map)
355
+ if (r !==
356
+ '[[[["1"],"100",["1024"]],"1089",[["1156"],"121",["1225"],"1296",["1369","144"]],"16",[["169"],"196",["225"]]],' +
357
+ '"25",' +
358
+ '[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
359
+ '"49",' +
360
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]'
361
+ ) { throw r }
362
+ }
363
+
364
+ {
365
+ /** @type {btree.Node<string>} */
366
+ let _map = ['1']
367
+ for (let i = 2; i <= 38; i++)
368
+ _map = set(_map)((i * i).toString())
369
+ const r = jsonStr(_map)
370
+ if (r !==
371
+ '[[[[["1"],"100",["1024"]],"1089",[["1156"],"121",["1225"]]],' +
372
+ '"1296",' +
373
+ '[[["1369"],"144",["1444"]],"16",[["169"],"196",["225"]]]],' +
374
+ '"25",' +
375
+ '[[[["256"],"289",["324"],"36",["361"]],"4",[["400"],"441",["484"]]],' +
376
+ '"49",' +
377
+ '[[["529"],"576",["625"]],"64",[["676"],"729",["784"]],"81",[["841"],"9",["900","961"]]]]]'
378
+ ) { throw r }
379
+ }
@@ -6,6 +6,7 @@ const { stringCmp } = require('../function/compare')
6
6
  const list = require('../list')
7
7
 
8
8
  require('./find/test')
9
+ require('./set/test')
9
10
 
10
11
  const jsonStr = json.stringify(sort)
11
12