theprogrammablemind_4wp 7.5.8-beta.9 → 7.5.8-beta.90
Sign up to get free protection for your applications and to get access to all the features.
- package/client.js +367 -280
- package/index.js +1 -0
- package/lines.js +2 -2
- package/package.json +2 -1
- package/runtime.js +3 -1
- package/src/config.js +559 -262
- package/src/flatten.js +9 -1
- package/src/helpers.js +16 -5
- package/src/project.js +81 -0
- package/src/semantics.js +6 -1
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/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,6 +63,8 @@ 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 {
|
57
69
|
if (v1.length != v2.length) {
|
58
70
|
return false
|
@@ -170,9 +182,6 @@ const isCompound = (value) => {
|
|
170
182
|
return isArray(value) || isObject(value)
|
171
183
|
}
|
172
184
|
|
173
|
-
nextCallId = 0
|
174
|
-
nextContextId = 0
|
175
|
-
|
176
185
|
class InitCalls {
|
177
186
|
|
178
187
|
constructor(name) {
|
@@ -196,9 +205,10 @@ class InitCalls {
|
|
196
205
|
// this.nextCallId += 1
|
197
206
|
// this.stack.push(this.nextCallId)
|
198
207
|
this.stack.push(this.nextCallId)
|
208
|
+
// TODO put the nextContextId in the context for debugging
|
199
209
|
const calls = this.stack.map( (call) => `${this.name}#call${call}` )
|
200
210
|
// return `Context#${this.nextContextId}: ${calls}`
|
201
|
-
return `Context#${nextContextId}: ${calls}`
|
211
|
+
return `Context#${this.nextContextId}: ${calls}`
|
202
212
|
}
|
203
213
|
|
204
214
|
current() {
|
@@ -320,7 +330,7 @@ const ecatch = (where, call) => {
|
|
320
330
|
try {
|
321
331
|
return call()
|
322
332
|
} catch( e ) {
|
323
|
-
throw new Error(`${where} ${e}`)
|
333
|
+
throw new Error(`${where} ${e.stack}`)
|
324
334
|
}
|
325
335
|
}
|
326
336
|
|
@@ -331,6 +341,7 @@ module.exports = {
|
|
331
341
|
mapInPlace,
|
332
342
|
validProps,
|
333
343
|
args,
|
344
|
+
safeNoDups,
|
334
345
|
safeEquals,
|
335
346
|
appendNoDups,
|
336
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 () {
|
@@ -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
|