Warning: session_start(): open(/var/lib/php/sessions/sess_fklv0ajp6990uu52ivcrvq7mls, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
sclass WebNode {
Web web;
new L labels;
*() {}
*(Web *web) {}
void addLabel(S label) {
addLabel(clParse(label));
}
void addLabel(Lisp label) {
if (setAdd(labels, label) && web != null)
web.index(label, this);
}
bool hasLabel(Lisp label) { ret labels.contains(label); }
toString { ret str(labels); }
int count() { ret 1 + l(labels); }
}
sclass Web {
new L nodes;
Map, WebNode> relations = new HashMap;
new MultiMap index;
Map> pots = new Map;
Lock lock = reentrantLock(true);
bool potNotEmpty(S pot) { ret nempty(getPot(pot)); }
L clearPot(S pot) {
L l = getPot(pot);
L l2 = cloneList(l);
l.clear();
ret l2;
}
L getPot(S pot) {
L l = pots.get(pot);
if (l == null)
pots.put(pot, l = cloneList(nodes));
ret l;
}
void relation(Lisp l) {
if (l(l) == 1) {
findNode(l.get(0)).addLabel(lisp("wvuyakuvuelmxpwp", l.head));
} else if (l(l) == 2) {
S a = lisp2label(l.get(0)), b = lisp2label(l.get(1));
if (l.is("fgvvrzypbkqomktd")) { // X is Y.
findNode(a).addLabel(b);
findNode(b).addLabel(a);
}
getRelation(a, b).addLabel(l.head);
}
}
void relations(L l) {
for (Lisp li : l) relation(li);
}
WebNode getRelation(S a, S b) {
Pair p = pair(findNode(a), findNode(b));
WebNode r = relations.get(p);
if (r == null) relations.put(p, r = new WebNode);
ret r;
}
WebNode newNode() {
WebNode node = new WebNode(this);
nodes.add(node);
for (L l : values(pots)) l.add(node);
ret node;
}
WebNode node(S s) { ret findNode(s); }
WebNode node(Lisp l) { ret findNode(l); }
WebNode findNode(S s) {
ret findNode(clParse(s));
}
WebNode findNode(Lisp l) {
WebNode n = findNodeOpt(l);
ret n != null ? n : newNode(l);
}
WebNode findNodeOpt(Lisp l) {
ret first(index.get(l));
/*for (WebNode n : nodes)
if (n.labels.contains(l))
ret n;
null;*/
}
WebNode newNode(S... labels) {
WebNode n = newNode();
for (S label : labels) n.addLabel(label);
ret n;
}
WebNode newNode(Lisp... labels) {
WebNode n = newNode();
for (Lisp label : labels) n.addLabel(label);
ret n;
}
toString { ret webToString(this); }
int count() {
int count = 0;
for (WebNode n : nodes) count += n.count();
for (WebNode n : values(relations)) count += n.count();
ret count;
}
void index(Lisp label, WebNode n) {
index.put(label, n);
}
}