tpmkms
Version:
Reusable libraries for Entodicton, a natural language to json converter
88 lines (74 loc) • 2.54 kB
JavaScript
const Digraph = require('../runtime').theprogrammablemind.Digraph
class API {
createOrdering({ name, categories=[], ordering=[] }) {
// sections = [slow fast] [love like hate detest] # ordered sections
// instances = x < y x == y x != y
this._objects[name] = {
categories,
contextToObjectToCategory: {},
lessThans: [],
ordering,
}
}
setCategory(name, context, object, category) {
// categories: context -> object -> category ie greg banana like
if (!this._objects[name].contextToObjectToCategory[context]) {
this._objects[name].contextToObjectToCategory[context] = {}
}
this._objects[name].contextToObjectToCategory[context][object] = category
category.truthValue = true
}
getCategory(name, context, object) {
return this._objects[name].contextToObjectToCategory[context][object]
}
inCategory(name, context, object, category) {
const digraph = new Digraph(this._objects[name].categories)
return digraph.isA(this.getCategory(name, context, object), category)
}
setLessThan( {name, context, smaller, larger} ) {
if (!this._objects[name].lessThans[context]) {
this._objects[name].lessThans[context] = []
}
this._objects[name].lessThans[context].push( [smaller, larger] )
}
getLessThan( {name, context, smaller, larger} ) {
const digraph = new Digraph(this._objects[name].lessThans[context])
// try the edges first
if (smaller && larger) {
if (digraph.lessThan(smaller, larger)) {
return [{name, context, smaller, larger}]
} else {
// fall to trying the categories
}
} else if (larger) {
const edges = []
for (const smaller of digraph.descendants(larger)) {
edges.push({ smaller, context, larger, name })
}
return edges;
} else if (smaller) {
const edges = []
for (const larger of digraph.ancestors(smaller)) {
edges.push({ smaller, context, larger, name })
}
return edges;
}
// try the categories instead
if (smaller && larger) {
const smallerCat = this.getCategory(name, context, smaller)
const largerCat = this.getCategory(name, context, larger)
if (smallerCat && largerCat) {
return new Digraph(this._objects[name].ordering).lessThan(smallerCat, largerCat)
}
}
}
initialize({km, objects}) {
if (km('properties')) {
this.propertiesAPI = km('properties').api
this._objects = objects
}
}
}
module.exports = {
API
}