functionalscript 0.0.286 → 0.0.290

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
@@ -9,8 +9,6 @@ FunctionalScript is a pure functional programming language and a strict subset o
9
9
 
10
10
  Create a new FunctionalScript repository on GitHub [here](https://github.com/functionalscript/template/generate).
11
11
 
12
- Try FunctionalScript [here](https://functionalscript.com/).
13
-
14
12
  ## 1. Design Principles
15
13
 
16
14
  In FunctionalScript:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "functionalscript",
3
- "version": "0.0.286",
3
+ "version": "0.0.290",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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]` |
@@ -5,7 +5,7 @@ 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
  /**
@@ -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