functionalscript 0.0.281 → 0.0.282

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.281",
3
+ "version": "0.0.282",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -2,7 +2,7 @@
2
2
 
3
3
  https://en.wikipedia.org/wiki/B-tree
4
4
 
5
- ## BTree 2-3 nodes
5
+ ## BTree 2-3 nodes
6
6
 
7
7
  `Node<T>`:
8
8
 
@@ -66,7 +66,7 @@ Posible actions:
66
66
  |left | 0|`[(L VM R) v1 n2]` |
67
67
  |right | 2|`[n0 v1 (L VM R)]` |
68
68
 
69
- ## Branch5 Overflow
69
+ ## Branch5 Overflow
70
70
 
71
71
  - current `[n0, v1, n2, v3, n4]`
72
72
  - overflow `[L, VM, R]`
@@ -76,3 +76,56 @@ Posible actions:
76
76
  |left | 0|`[...o v1 n2 v3 n4]`|`[(L VM R) v1 n2 v3 n4]`|`[[ L VM R ] v1 [n2 v3 n4]]`|
77
77
  |middle| 2|`[n0 v1 ...o v3 n4]`|`[n0 v1 (L VM R) v3 n4]`|`[[n0 v1 L ] VM [ R v3 n4]]`|
78
78
  |right | 4|`[n0 v1 n2 v3 ...o]`|`[n0 v1 n2 v3 (L VM R)]`|`[[n0 v1 n2] v3 [ L VM R ]]`|
79
+
80
+ ## Deleting a Node
81
+
82
+ |type |index| | | |
83
+ |------------------|-----|---------------------|--------|-----------------------------|
84
+ |`[v]` | 0| | |underflow `undefined` |
85
+ |`[v0,v1]` | 0| | |replace `[v1]` |
86
+ | | 1| | |replace `[v0]` |
87
+ |`[n0,v1,n2]` | 1|`concat(n0,n2)` |overflow|replace `[n0_,v1_,n1_]` |
88
+ | | | |replace |underflow `n_` |
89
+ |`[n0,v1,n2,v3,n4]`| 1|`concat(n0,n2),v3,n4`|overflow|replace `[n0_,v1_,n1_,v3,n4]`|
90
+ | | | |replace |replace `[n_,v3,n4]` |
91
+ | | 3|`n0,v1,concat(n2,n4)`|overflow|replace `[n0,v1,n0_,v1_,n1_]`|
92
+ | | | |replace |replace `[n0,v1,n_]` |
93
+
94
+ ### Underflow
95
+
96
+ |type |index| | |
97
+ |------------------|-----|---------------------------------------|-----------------------------------------------|
98
+ |`[n0,v1,n2]` | 0|`[[],v1,[v20]]` |underflow `[v1,v20]` |
99
+ | | |`[[],v1,[v20,v21]]` |replace `[[v1],v20,[v21]]` |
100
+ | | |`[[n_],v1,[n20,v21,n22]]` |underflow `[n_,v1,n20,v21,n22]` |
101
+ | | |`[[n_],v1,[n20,v21,n22,v23,n24]]` |replace `[[n_,v1,n20],v21,[n22,v23,n24]]` |
102
+ | | 2| | |
103
+ |`[n0,v1,n2,v3,n4]`| 0|`[[],v1,[v20],v3,n4]` |replace `[[v1,v20],v3,n4]` |
104
+ | | |`[[],v1,[v20,v21],v3,n4]` |replace `[[v1],v20,[v21],v3,n4]` |
105
+ | | |`[[n_],v1,[n20,v21,n22],v3,n4]` |replace `[[n_,v1,n20,v21,n22],v3,n4]` |
106
+ | | |`[[n_],v1,[n20,v21,n22,v23,n24],v3,n4]`|replace `[[n_,v1,n20],v21,[n22,v23,n24],v3,n4]`|
107
+ | | 2| | |
108
+ | | 4| | |
109
+
110
+ ## Concat (n0,n1)
111
+
112
+ `concat` returns either `overflow 3` or `replace`:
113
+ - `overflow 3`: `[n0,v1,n2]`
114
+ - `replace`: `n`
115
+
116
+ |`n0` |`n1` | |
117
+ |-----------------------|-----------------------|-------------------------------------------------|
118
+ |`[v00]` |`[v10]` |R `[v00,v10]` |
119
+ | |`[v10,v11]` |O `[[v00],v10,[v11]]` |
120
+ |`[v00,v01]` |`n1` |O `[[v00],v01,n1]` |
121
+ |`[n00,v01,n02]` |`[n10,v11,n12]` |`n00,v01,concat(n02,n10),v11,n12` |
122
+ | |`[n10,v11,n12,v13,n14]`|`n00,v01,concat(n02,n10),v11,n12,v13,n14` |
123
+ |`[n00,v01,n02,v03,n04]`|`[n10,v11,n12]` |`n00,v01,n02,v03,concat(n04,n10),v11,n12` |
124
+ | |`[n10,v11,n12,v13,n14]`|`n00,v01,n02,v03,concat(n04,n10),v11,n12,v13,n14`|
125
+
126
+ |source |replace `cn` |overflow `[cn0,cv1,cn2]` |
127
+ |---------------------------------------|------------------------------------|---------------------------------------------|
128
+ |`n0,v1,concat(n2,n3),v4,n5` |R `[n0,v1,cn,v2,n3]` |O `[[n0,v1,cn0],cv1,[cn2,v4,n5]]` |
129
+ |`n0,v1,concat(n2,n3),v4,n5,v6,n7` |O `[[n0,v1,cn],v4,[n5,v6,n7]]` |O `[[n0,v1,cn0],cv1,[cn2,v4,n5,v6,n7]]` |
130
+ |`n0,v1,n2,v3,concat(n4,n5),v6,n7` |O `[[n0,v1,n2],v3,[cn,v6,n7]]` |O `[[n0,v1,n2,v3,cn0],cv1,[cn2,v6,n7]]` |
131
+ |`n0,v1,n2,v3,concat(n4,n5),v6,n7,v8,n9`|O `[[n0,v1,n2],v3,[cn,v6,n7,v8,n9]]`|O `[[n0,v1,n2,v3,cn0],cv1,[cn2,v6,n7,v8,n9]]`|
@@ -138,7 +138,7 @@ const seq = require('../list')
138
138
 
139
139
  /**
140
140
  * @template T
141
- * @typedef { readonly [Node<T>, T, Node<T>, T, Node<T>, T, Node<T>] } Branch7
141
+ * @typedef { readonly[...Branch5<T>, T, Node<T>] } Branch7
142
142
  */
143
143
 
144
144
  /** @type {<T>(n: Branch7<T>) => Branch3<T>} */
@@ -346,6 +346,91 @@ const values = node => () => {
346
346
  }
347
347
  }
348
348
 
349
+ /**
350
+ * @template T
351
+ * @typedef {readonly[Node<T>]} Branch1
352
+ */
353
+
354
+ /**
355
+ * @template T
356
+ * @typedef { Branch1<T> | Branch3<T> } ConcatResult
357
+ */
358
+
359
+ /**
360
+ * @template T
361
+ * @typedef {readonly[...Branch7<T>,T,Node<T>]} Branch9
362
+ */
363
+
364
+ /**
365
+ * @template T
366
+ * @typedef {readonly[...Branch9<T>,T,Node<T>]} Branch11
367
+ */
368
+
369
+ /** @type {<T>(n: Branch5<T> | Branch7<T> | Branch9<T> | Branch11<T>) => Branch1<T> | Branch3<T>} */
370
+ const up = n => {
371
+ switch (n.length) {
372
+ case 5: { return [n] }
373
+ case 7: {
374
+ const [n0, v1, n2, v3, n4, v5, n6] = n
375
+ return [[n0, v1, n2], v3, [n4, v5, n6]]
376
+ }
377
+ case 9: {
378
+ const [n0, v1, n2, v3, n4, v5, n6, v7, n8] = n
379
+ return [[n0, v1, n2], v3, [n4, v5, n6, v7, n8]]
380
+ }
381
+ case 11: {
382
+ const [n0, v1, n2, v3, n4, v5, n6, v7, n8, v9, n10] = n
383
+ return [[n0, v1, n2, v3, n4], v5, [n6, v7, n8, v9, n10]]
384
+ }
385
+ }
386
+ }
387
+
388
+ /**
389
+ * @template T
390
+ * @typedef {readonly[Node<T>,T]} Head2
391
+ */
392
+
393
+ /**
394
+ * @template T
395
+ * @typedef {readonly[...Head2<T>, ...Head2<T>]} Head4
396
+ */
397
+
398
+ /** @type {<T>(n: Branch3<T> | Branch5<T>) => readonly[Head2<T>|Head4<T>, Node<T>]} */
399
+ const bracnhSplit = n => {
400
+ if (n.length === 3) {
401
+ const [n0, v1, n2] = n
402
+ return [[n0, v1], n2]
403
+ } else {
404
+ const [n0, v1, n2, v3, n4] = n
405
+ return [[n0, v1, n2, v3], n4]
406
+ }
407
+ }
408
+
409
+ /** @type {<T>(a: Node<T>) => (b: Node<T>) => ConcatResult<T>} */
410
+ const concat = a => b => {
411
+ /** @typedef {typeof a extends Node<infer T> ? T : never} T */
412
+ switch (a.length) {
413
+ case 1: {
414
+ switch (b.length) {
415
+ case 1: { return [[a[0], b[0]]] }
416
+ case 2: { return [a, b[0], [b[1]]] }
417
+ default: { throw 'invalid b node' }
418
+ }
419
+ }
420
+ case 2: { return [[a[0]], a[1], b] }
421
+ default: {
422
+ switch (b.length) {
423
+ case 3: case 5: {
424
+ const [aHead, aLast] = bracnhSplit(a)
425
+ const [bn0, ...b1] = b
426
+ return up([...aHead, ...concat(aLast)(bn0), ...b1])
427
+ }
428
+ default: { throw 'invalid b node' }
429
+ }
430
+ }
431
+ }
432
+ }
433
+
349
434
  module.exports = {
350
435
  /** @readonly */
351
436
  values,
@@ -363,5 +448,7 @@ module.exports = {
363
448
  /** @readonly */
364
449
  getOrInsertVisitor: visit(getOrInsertVisitor),
365
450
  /** @readonly */
366
- replaceVisitor: visit(replaceVisitor)
451
+ replaceVisitor: visit(replaceVisitor),
452
+ /** @readonly */
453
+ concat,
367
454
  }
@@ -1,5 +1,5 @@
1
1
  const btree = require('.')
2
- const { getVisitor, setVisitor, values } = btree
2
+ const { getVisitor, setVisitor, values, concat } = btree
3
3
  const json = require('../../json')
4
4
  const { sort } = require('../object')
5
5
  const { stringCmp } = require('../function/compare')
@@ -56,6 +56,37 @@ const set = node => value => {
56
56
  if (result !== undefined) { throw result }
57
57
  }
58
58
 
59
+ {
60
+ /** @type {btree.Node<string>} */
61
+ let _map = ['1']
62
+ for (let i = 2; i <= 10; i++)
63
+ _map = set(_map)((i * i).toString())
64
+ if (_map.length !== 3) { throw _map }
65
+ // console.log(_map)
66
+ let [a,,b] = _map
67
+ let _c = concat(a)(b)
68
+ // console.log(_c)
69
+ if (_c.length !== 3) { throw _c }
70
+ [a,,b] = _c
71
+ _c = concat(a)(b)
72
+ // console.log(_c)
73
+ if (_c.length !== 1) { throw _c }
74
+ let [_r] = _c
75
+ if (_r.length !== 5) { throw _r }
76
+ [a,,b] = _r
77
+ _c = concat(a)(b)
78
+ // console.log(_c)
79
+ if (_c.length !== 3) { throw _c }
80
+ [a,,b] = _c
81
+ _c = concat(a)(b)
82
+ // console.log(_c)
83
+ if (_c.length !== 3) { throw _c }
84
+ [a,,b] = _c
85
+ _c = concat(a)(b)
86
+ // console.log(_c)
87
+ if (_c.length !== 1) { throw _c }
88
+ }
89
+
59
90
  const test = () => {
60
91
  /** @type {btree.Node<string>} */
61
92
  let _map = ['a']