theprogrammablemind_4wp 7.5.8 → 7.6.0
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +589 -345
- package/index.js +1 -0
- package/lines.js +3 -3
- package/package.json +2 -1
- package/runtime.js +3 -1
- package/src/config.js +699 -325
- package/src/flatten.js +9 -1
- package/src/generators.js +2 -2
- package/src/helpers.js +38 -10
- package/src/project.js +81 -0
- package/src/semantics.js +8 -3
package/src/flatten.js
CHANGED
@@ -89,7 +89,15 @@ const flatten = (markers, value) => {
|
|
89
89
|
const split = markers.includes(marker)
|
90
90
|
if (split) {
|
91
91
|
if ('value' in properties) {
|
92
|
-
|
92
|
+
flattenedValues = []
|
93
|
+
for (let v of properties.value) {
|
94
|
+
if (v.flatten) {
|
95
|
+
flattenedValues = flattenedValues.concat(flatten(markers, v)[0])
|
96
|
+
} else {
|
97
|
+
flattenedValues.push(v)
|
98
|
+
}
|
99
|
+
}
|
100
|
+
return [flattenedValues, true]
|
93
101
|
} else {
|
94
102
|
return [[value], false]
|
95
103
|
}
|
package/src/generators.js
CHANGED
@@ -75,7 +75,7 @@ class Generator {
|
|
75
75
|
|
76
76
|
apply (baseArgs, objects, g, gs, context, hierarchy, config, response, log, options = {}) {
|
77
77
|
if (!log) {
|
78
|
-
throw 'generators.apply argument log is required'
|
78
|
+
throw new Error('generators.apply argument log is required')
|
79
79
|
}
|
80
80
|
if (baseArgs.call && config && sbaseArgs.calls.stack.length > config.maxDepth) {
|
81
81
|
throw new Error(`Max depth of ${config.maxDepth} for calls has been exceeded. maxDepth can be set on the config object. To see the calls run with the --dl or set the debugLoops property on the config`)
|
@@ -292,7 +292,7 @@ class Generators {
|
|
292
292
|
lines.setElement(0, 2, JSON.stringify(context, null, 2))
|
293
293
|
this.logs.push(lines.toString())
|
294
294
|
}
|
295
|
-
contextsPrime.push(generated)
|
295
|
+
contextsPrime.push((config || {}).parenthesized ? "(" + generated + ")" : generated)
|
296
296
|
}
|
297
297
|
return contextsPrime
|
298
298
|
}
|
package/src/helpers.js
CHANGED
@@ -43,6 +43,16 @@ const appendNoDups = (l1, l2) => {
|
|
43
43
|
}
|
44
44
|
}
|
45
45
|
|
46
|
+
const safeNoDups = (list) => {
|
47
|
+
noDups = []
|
48
|
+
for (const element of list) {
|
49
|
+
if (!noDups.find((e) => safeEquals(e, element))) {
|
50
|
+
noDups.push(element)
|
51
|
+
}
|
52
|
+
}
|
53
|
+
return noDups
|
54
|
+
}
|
55
|
+
|
46
56
|
const safeEquals = (v1, v2) => {
|
47
57
|
if (typeof v1 !== typeof v2) {
|
48
58
|
return false
|
@@ -53,7 +63,12 @@ const safeEquals = (v1, v2) => {
|
|
53
63
|
return v1 == v2
|
54
64
|
} else if (type == 'function') {
|
55
65
|
return v1.toString() == v2.toString()
|
66
|
+
} else if (v1 == undefined || v2 == undefined) {
|
67
|
+
return v1 == v2
|
56
68
|
} else {
|
69
|
+
if (v1.length != v2.length) {
|
70
|
+
return false
|
71
|
+
}
|
57
72
|
for (let key in v1) {
|
58
73
|
if (!safeEquals(v1[key], v2[key])) {
|
59
74
|
return false
|
@@ -167,15 +182,13 @@ const isCompound = (value) => {
|
|
167
182
|
return isArray(value) || isObject(value)
|
168
183
|
}
|
169
184
|
|
170
|
-
nextCallId = 0
|
171
|
-
nextContextId = 0
|
172
|
-
|
173
185
|
class InitCalls {
|
174
186
|
|
175
|
-
constructor() {
|
187
|
+
constructor(name) {
|
176
188
|
this.nextCallId = 0
|
177
189
|
this.nextContextId = 0
|
178
190
|
this.stack = []
|
191
|
+
this.name = name
|
179
192
|
}
|
180
193
|
|
181
194
|
start() {
|
@@ -192,13 +205,14 @@ class InitCalls {
|
|
192
205
|
// this.nextCallId += 1
|
193
206
|
// this.stack.push(this.nextCallId)
|
194
207
|
this.stack.push(this.nextCallId)
|
195
|
-
|
208
|
+
// TODO put the nextContextId in the context for debugging
|
209
|
+
const calls = this.stack.map( (call) => `${this.name}#call${call}` )
|
196
210
|
// return `Context#${this.nextContextId}: ${calls}`
|
197
|
-
return `Context#${nextContextId}: ${calls}`
|
211
|
+
return `Context#${this.nextContextId}: ${calls}`
|
198
212
|
}
|
199
213
|
|
200
214
|
current() {
|
201
|
-
return
|
215
|
+
return `${this.name}#call${this.stack[this.stack.length-1]}`
|
202
216
|
}
|
203
217
|
|
204
218
|
touch(context) {
|
@@ -234,13 +248,17 @@ const validProps = (valids, object, type) => {
|
|
234
248
|
for (let prop of Object.keys(object)) {
|
235
249
|
let okay = false
|
236
250
|
for (valid of valids) {
|
237
|
-
if (
|
238
|
-
okay =
|
251
|
+
if (typeof valid == 'string') {
|
252
|
+
okay = prop == valid
|
253
|
+
} else {
|
254
|
+
okay = prop.match(valid)
|
255
|
+
}
|
256
|
+
if (okay) {
|
239
257
|
break
|
240
258
|
}
|
241
259
|
}
|
242
260
|
if (!okay) {
|
243
|
-
throw `Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`
|
261
|
+
throw new Error(`Unknown property "${prop}" in the ${type}. Valid properties are ${valids}. The ${type} is ${JSON.stringify(object)}`)
|
244
262
|
}
|
245
263
|
}
|
246
264
|
}
|
@@ -308,12 +326,22 @@ const functionsToStrings = (config) => {
|
|
308
326
|
return config
|
309
327
|
}
|
310
328
|
|
329
|
+
const ecatch = (where, call) => {
|
330
|
+
try {
|
331
|
+
return call()
|
332
|
+
} catch( e ) {
|
333
|
+
throw new Error(`${where} ${e.stack}`)
|
334
|
+
}
|
335
|
+
}
|
336
|
+
|
311
337
|
module.exports = {
|
338
|
+
ecatch,
|
312
339
|
functionsToStrings,
|
313
340
|
updateQueries,
|
314
341
|
mapInPlace,
|
315
342
|
validProps,
|
316
343
|
args,
|
344
|
+
safeNoDups,
|
317
345
|
safeEquals,
|
318
346
|
appendNoDups,
|
319
347
|
hashIndexesGet,
|
package/src/project.js
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
const project = (object, filter) => {
|
3
|
+
if (!object) {
|
4
|
+
return
|
5
|
+
}
|
6
|
+
|
7
|
+
let projection = {}
|
8
|
+
const set = (property, value) => {
|
9
|
+
if (value === null || value === undefined) {
|
10
|
+
return
|
11
|
+
}
|
12
|
+
projection[property] = value
|
13
|
+
}
|
14
|
+
if (Array.isArray(filter)) {
|
15
|
+
if (Array.isArray(object)) {
|
16
|
+
return object.map( element => project(element, filter) )
|
17
|
+
} else {
|
18
|
+
for (let properties of filter) {
|
19
|
+
if (typeof properties == 'object') {
|
20
|
+
if (properties.propertyLists) {
|
21
|
+
for (const propertyList in properties.propertyLists) {
|
22
|
+
if (object[propertyList]) {
|
23
|
+
for (const property of object[propertyList]) {
|
24
|
+
set(property, project(object[property], properties.propertyLists[propertyList]))
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
if (properties.valueLists) {
|
30
|
+
for (const listProperty in properties.valueLists) {
|
31
|
+
const old = object[listProperty]
|
32
|
+
if (Array.isArray(old)) {
|
33
|
+
set(listProperty, old.map((element) => project(element, properties.valueLists[listProperty])))
|
34
|
+
} else {
|
35
|
+
set(listProperty, project(old, properties.valueLists[listProperty]))
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
if (properties.properties) {
|
40
|
+
for (const property in properties.properties) {
|
41
|
+
const old = object[property]
|
42
|
+
set(property, project(old, properties.properties[property]))
|
43
|
+
}
|
44
|
+
}
|
45
|
+
if (properties.property) {
|
46
|
+
const property = properties.property
|
47
|
+
if (properties.isPropertyList) {
|
48
|
+
debugger
|
49
|
+
if (!Array.isArray(object[property])) {
|
50
|
+
return projection
|
51
|
+
}
|
52
|
+
for (const propertyRef of object[property]) {
|
53
|
+
const old = object[propertyRef]
|
54
|
+
set(propertyRef, project(old, properties.filter))
|
55
|
+
}
|
56
|
+
} else {
|
57
|
+
const old = object[property]
|
58
|
+
set(property, project(old, properties.filter))
|
59
|
+
}
|
60
|
+
}
|
61
|
+
} else {
|
62
|
+
if (!Array.isArray(properties)) {
|
63
|
+
properties = [properties]
|
64
|
+
}
|
65
|
+
for (const property of properties) {
|
66
|
+
set(property, object[property])
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
}
|
71
|
+
} else if (typeof filter == 'object') {
|
72
|
+
for (const property of Object.keys(filter)) {
|
73
|
+
set(property, project(object[property], filter[property]))
|
74
|
+
}
|
75
|
+
}
|
76
|
+
return projection
|
77
|
+
}
|
78
|
+
|
79
|
+
module.exports = { project }
|
80
|
+
|
81
|
+
|
package/src/semantics.js
CHANGED
@@ -6,7 +6,7 @@ class Semantic {
|
|
6
6
|
// constructor ({match, apply, uuid, index, km, notes}) {
|
7
7
|
constructor (semantic) {
|
8
8
|
semantic = normalizeSemantic(semantic)
|
9
|
-
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property } = semantic
|
9
|
+
const { match, apply, uuid, index, km, notes, priority, debug, where, applyWrapped, property, oneShot, id } = semantic
|
10
10
|
this.matcher = match
|
11
11
|
this._apply = apply
|
12
12
|
this._applyWrapped = applyWrapped
|
@@ -18,6 +18,8 @@ class Semantic {
|
|
18
18
|
this.notes = notes
|
19
19
|
this.callId = debug
|
20
20
|
this.where = where
|
21
|
+
this.oneShot = oneShot
|
22
|
+
this.id = id
|
21
23
|
}
|
22
24
|
|
23
25
|
toLabel () {
|
@@ -89,7 +91,7 @@ class Semantic {
|
|
89
91
|
// const ask = baseArgs.getAsk(this.uuid)
|
90
92
|
if (!log) {
|
91
93
|
console.trace()
|
92
|
-
throw 'log is a required argument'
|
94
|
+
throw new Error('log is a required argument')
|
93
95
|
}
|
94
96
|
const contextPrime = Object.assign({}, context)
|
95
97
|
let n = (id) => id
|
@@ -197,6 +199,9 @@ class Semantics {
|
|
197
199
|
const log = (message) => { this.logs.push(message) }
|
198
200
|
try {
|
199
201
|
contextPrime = semantic.apply(args, context, s, log, options)
|
202
|
+
if (!contextPrime.controlKeepMotivation && semantic.oneShot) {
|
203
|
+
args.config.removeSemantic(semantic)
|
204
|
+
}
|
200
205
|
} catch( e ) {
|
201
206
|
contextPrime = null
|
202
207
|
let errorMessage
|
@@ -237,7 +242,7 @@ class Semantics {
|
|
237
242
|
// this.logs.push(message)
|
238
243
|
// return [message]
|
239
244
|
args.calls.pop()
|
240
|
-
throw { error: [message], logs: this.logs }
|
245
|
+
throw { error: [message], logs: this.logs, reason: e.reason }
|
241
246
|
}
|
242
247
|
args.calls.touch(contextPrime)
|
243
248
|
// this.logs.push(`Semantics: applied ${semantic.toString()}\n to\n ${JSON.stringify(context)}\n the result was ${JSON.stringify(contextPrime)}\n`)
|