functionalscript 0.0.278 → 0.0.279

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.278",
3
+ "version": "0.0.279",
4
4
  "description": "FunctionalScript is a functional subset of JavaScript",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,3 +1,4 @@
1
+ const { todo } = require('../../dev')
1
2
  const cmp = require('../function/compare')
2
3
  const { index3, index5 } = cmp
3
4
  const seq = require('../list')
@@ -87,10 +88,10 @@ const seq = require('../list')
87
88
  * @typedef { Done<T> | Replace<T> | Overflow<T> } Result
88
89
  */
89
90
 
90
- /** @typedef {<T>(_: Lazy<T>) => (_: Leaf1<T>) => Result<T>} InLeaf1 */
91
- /** @typedef {<T>(_: Lazy<T>) => (_: Leaf2<T>) => Result<T>} InLeaf2 */
92
- /** @typedef {<T>(_: Lazy<T>) => (_: Branch3<T>) => Result<T>} InBranch3 */
93
- /** @typedef {<T>(_: Lazy<T>) => (_: Branch5<T>) => Result<T>} InBranch5 */
91
+ /** @typedef {<T>(_: Leaf1<T>) => LazyResult<T>} InLeaf1 */
92
+ /** @typedef {<T>(_: Leaf2<T>) => LazyResult<T>} InLeaf2 */
93
+ /** @typedef {<T>(_: Branch3<T>) => LazyResult<T>} InBranch3 */
94
+ /** @typedef {<T>(_: Branch5<T>) => LazyResult<T>} InBranch5 */
94
95
 
95
96
  /**
96
97
  * @typedef {{
@@ -113,6 +114,21 @@ const seq = require('../list')
113
114
  * }} NotFound
114
115
  */
115
116
 
117
+ /**
118
+ * @template T
119
+ * @typedef {(f: (_: Node<T>) => LazyResult<T>) => LazyResult<T>} FResult<T>
120
+ */
121
+
122
+ /**
123
+ * @typedef {{
124
+ * readonly branch3_left: <T>(branch3: Branch3<T>) => FResult<T>
125
+ * readonly branch3_right: <T>(branch3: Branch3<T>) => FResult<T>
126
+ * readonly branch5_left: <T>(branch5: Branch5<T>) => FResult<T>
127
+ * readonly branch5_middle: <T>(branch5: Branch5<T>) => FResult<T>
128
+ * readonly branch5_right: <T>(branch5: Branch5<T>) => FResult<T>
129
+ * }} Continue
130
+ */
131
+
116
132
  /**
117
133
  * @typedef {{
118
134
  * readonly found: Found
@@ -128,13 +144,19 @@ const seq = require('../list')
128
144
  /** @type {<T>(n: Branch7<T>) => Branch3<T>} */
129
145
  const split = ([n0, v1, n2, v3, n4, v5, n6]) => [[n0, v1, n2], v3, [n4, v5, n6]]
130
146
 
147
+ /**
148
+ * @template T
149
+ * @typedef {(init: Lazy<T>) => Result<T>} LazyResult
150
+ */
151
+
131
152
  /**
132
153
  * @type {<T>(extend: (o: Branch3<T>) => Result<T>) =>
133
154
  * (replace: (r: Node<T>) => Node<T>) =>
134
- * (result: Result<T>) =>
135
- * Result<T>}
155
+ * (result: LazyResult<T>) =>
156
+ * LazyResult<T>}
136
157
  */
137
- const merge = extend => replace => result => {
158
+ const merge = extend => replace => lazyResult => init => {
159
+ const result = lazyResult(init)
138
160
  switch (result[0]) {
139
161
  case 'done': { return result }
140
162
  case 'replace': { return ['replace', replace(result[1])] }
@@ -142,7 +164,7 @@ const merge = extend => replace => result => {
142
164
  }
143
165
  }
144
166
 
145
- /** @type {(visitor: Visitor) => <T>(cmp: Cmp<T>) => (init: Lazy<T>) => (node: Node<T>) => Result<T>} */
167
+ /** @type {(visitor: Visitor) => <T>(cmp: Cmp<T>) => (node: Node<T>) => LazyResult<T>} */
146
168
  const visit = ({ found, notFound }) => cmp => {
147
169
  const i3 = index3(cmp)
148
170
  const i5 = index5(cmp)
@@ -150,84 +172,82 @@ const visit = ({ found, notFound }) => cmp => {
150
172
  /**
151
173
  * @type {(extend: (o: Branch3<T>) => Branch5<T>) =>
152
174
  * (replace: (r: Node<T>) => Branch3<T>) =>
153
- * (result: Result<T>) =>
154
- * Result<T>}
175
+ * (result: LazyResult<T>) =>
176
+ * LazyResult<T>}
155
177
  */
156
178
  const merge2 = extend => merge(o => ['replace', extend(o)])
157
179
  /**
158
180
  * @type {(extend: (o: Branch3<T>) => Branch7<T>) =>
159
181
  * (replace: (r: Node<T>) => Branch5<T>) =>
160
- * (result: Result<T>) =>
161
- * Result<T>}
182
+ * (result: LazyResult<T>) =>
183
+ * LazyResult<T>}
162
184
  */
163
185
  const merge3 = extend => merge(o => ['overflow', split(extend(o))])
164
- return init => {
165
- /** @type {(node: Node<T>) => Result<T>} */
166
- const f = node => {
167
- switch (node.length) {
168
- case 1: {
169
- switch (i3(node[0])) {
170
- case 0: { return notFound.leaf1_left(init)(node) }
171
- case 1: { return found.leaf1(init)(node) }
172
- default: { return notFound.leaf1_right(init)(node) }
173
- }
186
+ /** @type {(node: Node<T>) => LazyResult<T>} */
187
+ const f = node => {
188
+ switch (node.length) {
189
+ case 1: {
190
+ switch (i3(node[0])) {
191
+ case 0: { return notFound.leaf1_left(node) }
192
+ case 1: { return found.leaf1(node) }
193
+ default: { return notFound.leaf1_right(node) }
174
194
  }
175
- case 2: {
176
- switch (i5(node)) {
177
- case 0: { return notFound.leaf2_left(init)(node) }
178
- case 1: { return found.leaf2_left(init)(node) }
179
- case 2: { return notFound.leaf2_middle(init)(node) }
180
- case 3: { return found.leaf2_right(init)(node) }
181
- default: { return notFound.leaf2_right(init)(node) }
182
- }
195
+ }
196
+ case 2: {
197
+ switch (i5(node)) {
198
+ case 0: { return notFound.leaf2_left(node) }
199
+ case 1: { return found.leaf2_left(node) }
200
+ case 2: { return notFound.leaf2_middle(node) }
201
+ case 3: { return found.leaf2_right(node) }
202
+ default: { return notFound.leaf2_right(node) }
183
203
  }
184
- case 3: {
185
- const [n0, v1, n2] = node
186
- switch (i3(v1)) {
187
- case 0: {
188
- return merge2
189
- (e => [...e, v1, n2])
190
- (r => [r, v1, n2])
191
- (f(n0))
192
- }
193
- case 1: { return found.branch3(init)(node) }
194
- default: {
195
- return merge2
196
- (e => [n0, v1, ...e])
197
- (r => [n0, v1, r])
198
- (f(n2))
199
- }
204
+ }
205
+ case 3: {
206
+ const [n0, v1, n2] = node
207
+ switch (i3(v1)) {
208
+ case 0: {
209
+ return merge2
210
+ (e => [...e, v1, n2])
211
+ (r => [r, v1, n2])
212
+ (f(n0))
213
+ }
214
+ case 1: { return found.branch3(node) }
215
+ default: {
216
+ return merge2
217
+ (e => [n0, v1, ...e])
218
+ (r => [n0, v1, r])
219
+ (f(n2))
200
220
  }
201
221
  }
202
- default: {
203
- const [n0, v1, n2, v3, n4] = node
204
- switch (i5([v1, v3])) {
205
- case 0: {
206
- return merge3
207
- (o => [...o, v1, n2, v3, n4])
208
- (r => [r, v1, n2, v3, n4])
209
- (f(n0))
210
- }
211
- case 1: { return found.branch5_left(init)(node) }
212
- case 2: {
213
- return merge3
214
- (o => [n0, v1, ...o, v3, n4])
215
- (r => [n0, v1, r, v3, n4])
216
- (f(n2))
217
- }
218
- case 3: { return found.branch5_right(init)(node) }
219
- default: {
220
- return merge3
221
- (o => [n0, v1, n2, v3, ...o])
222
- (r => [n0, v1, n2, v3, r])
223
- (f(n4))
224
- }
222
+ }
223
+ default: {
224
+ const [n0, v1, n2, v3, n4] = node
225
+ switch (i5([v1, v3])) {
226
+ case 0: {
227
+ return merge3
228
+ (o => [...o, v1, n2, v3, n4])
229
+ (r => [r, v1, n2, v3, n4])
230
+ (f(n0))
231
+ }
232
+ case 1: { return found.branch5_left(node) }
233
+ case 2: {
234
+ return merge3
235
+ (o => [n0, v1, ...o, v3, n4])
236
+ (r => [n0, v1, r, v3, n4])
237
+ (f(n2))
238
+ }
239
+ case 3: { return found.branch5_right(node) }
240
+ default: {
241
+ return merge3
242
+ (o => [n0, v1, n2, v3, ...o])
243
+ (r => [n0, v1, n2, v3, r])
244
+ (f(n4))
225
245
  }
226
246
  }
227
247
  }
228
248
  }
229
- return f
230
249
  }
250
+ return f
231
251
  }
232
252
 
233
253
  /** @type { <T>(_: T) => Done<T> } */
@@ -235,12 +255,12 @@ const found = value => ['done', value]
235
255
 
236
256
  /** @type {Found} */
237
257
  const foundGet = {
238
- leaf1: () => ([value]) => found(value),
239
- leaf2_left: () => ([value]) => found(value),
240
- leaf2_right: () => ([, value]) => found(value),
241
- branch3: () => ([, value]) => found(value),
242
- branch5_left: () => ([, value]) => found(value),
243
- branch5_right: () => ([, , , value]) => found(value),
258
+ leaf1: ([value]) => () => found(value),
259
+ leaf2_left: ([value]) => () => found(value),
260
+ leaf2_right: ([, value]) => () => found(value),
261
+ branch3: ([, value]) => () => found(value),
262
+ branch5_left: ([, value]) => () => found(value),
263
+ branch5_right: ([, , , value]) => () => found(value),
244
264
  }
245
265
  /** @type { () => () => NotFoundDone } */
246
266
  const notFound = () => () => ['done']
@@ -259,12 +279,12 @@ const replace = node => ['replace', node]
259
279
 
260
280
  /** @type {Found} */
261
281
  const foundReplace = {
262
- leaf1: f => () => replace([f()]),
263
- leaf2_left: f => ([, v1]) => replace([f(), v1]),
264
- leaf2_right: f => ([v0,]) => replace([v0, f()]),
265
- branch3: f => ([n0, , n2]) => replace([n0, f(), n2]),
266
- branch5_left: f => ([n0, , n2, v3, n4]) => replace([n0, f(), n2, v3, n4]),
267
- branch5_right: f => ([n0, v1, n2, , n4]) => replace([n0, v1, n2, f(), n4])
282
+ leaf1: () => f => replace([f()]),
283
+ leaf2_left: ([, v1]) => f => replace([f(), v1]),
284
+ leaf2_right: ([v0,]) => f => replace([v0, f()]),
285
+ branch3: ([n0, , n2]) => f => replace([n0, f(), n2]),
286
+ branch5_left: ([n0, , n2, v3, n4]) => f => replace([n0, f(), n2, v3, n4]),
287
+ branch5_right: ([n0, v1, n2, , n4]) => f => replace([n0, v1, n2, f(), n4])
268
288
  }
269
289
 
270
290
  /** @type {<T>(leaf3: Array3<T>) => Result<T>} */
@@ -272,11 +292,11 @@ const overflow = ([v0, v1, v2]) => ['overflow', [[v0], v1, [v2]]]
272
292
 
273
293
  /** @type {NotFound} */
274
294
  const notFoundInsert = {
275
- leaf1_left: f => ([v]) => replace([f(), v]),
276
- leaf1_right: f => ([v]) => replace([v, f()]),
277
- leaf2_left: f => ([v0, v1]) => overflow([f(), v0, v1]),
278
- leaf2_middle: f => ([v0, v1]) => overflow([v0, f(), v1]),
279
- leaf2_right: f => ([v0, v1]) => overflow([v0, v1, f()]),
295
+ leaf1_left: ([v]) => f => replace([f(), v]),
296
+ leaf1_right: ([v]) => f => replace([v, f()]),
297
+ leaf2_left: ([v0, v1]) => f => overflow([f(), v0, v1]),
298
+ leaf2_middle: ([v0, v1]) => f => overflow([v0, f(), v1]),
299
+ leaf2_right: ([v0, v1]) => f => overflow([v0, v1, f()]),
280
300
  }
281
301
 
282
302
  /** @type {Visitor} */
@@ -303,7 +323,7 @@ const replaceVisitor = {
303
323
  notFound: notFoundGet,
304
324
  }
305
325
 
306
- /** @type {<T>(node: Node<T>) => seq.List<T>} */
326
+ /** @type {<T>(node: Node<T>) => seq.Thunk<T>} */
307
327
  const values = node => () => {
308
328
  switch (node.length) {
309
329
  case 1: case 2: { return node }
@@ -334,9 +354,9 @@ module.exports = {
334
354
  * @type { <T>(cmp: Cmp<T>) => (node: Node<T>) => T|undefined }
335
355
  */
336
356
  getVisitor: cmp => node => {
337
- const result = visit(getVisitor)(cmp)(() => { throw 'getVisitor' })(node)
338
- if (result[0] === 'done') { return result[1] }
339
- return undefined
357
+ const result = visit(getVisitor)(cmp)(node)(() => { throw 'getVisitor' })
358
+ if (result[0] !== 'done') { throw 'getVisitor result' }
359
+ return result[1]
340
360
  },
341
361
  /** @readonly */
342
362
  setVisitor: visit(setVisitor),
@@ -1,11 +1,11 @@
1
1
  const btree = require('.')
2
2
  const { setVisitor, values } = btree
3
- const { cmp } = require('../function/compare')
3
+ const { cmp } = require('../function/compare')
4
4
  const list = require('../list')
5
5
 
6
6
  /** @type {(node: btree.Node<string>) => (value: string) => btree.Node<string>} */
7
7
  const set = node => value => {
8
- const result = setVisitor(cmp(value))(() => value)(node)
8
+ const result = setVisitor(cmp(value))(node)(() => value)
9
9
  switch (result[0]) {
10
10
  case 'replace': case 'overflow': { return result[1] }
11
11
  default: { return node }
@@ -47,7 +47,7 @@ const set = name => value => map => {
47
47
  /** @type {Entry<typeof value>} */
48
48
  const entry = [name, value]
49
49
  if (map === undefined) { return [entry] }
50
- const result = setVisitor(keyCmp(name))(() => entry)(map)
50
+ const result = setVisitor(keyCmp(name))(map)(() => entry)
51
51
  switch (result[0]) {
52
52
  case 'replace': case 'overflow': { return result[1] }
53
53
  default: { throw 'invalid BTree operation' }