sinterface ISearchVar {
bool set(O o);
O get();
}
sclass MatchVar<A extends Concept> implements IRef<A>, ISearchVar {
A value;
Class<A> type;
public A get() { ret value; }
public S toString() { ret str(value); }
bool canHold(O o) { ret type == null || isInstance(type, o); }
public bool set(O o) { if (canHold(o)) { value = (A) o; true; } else false; }
}
sclass Subsearch {
Class c;
O[] params;
*(Class *c, O[] params) {
this.params = expandParams(c, params);
}
}
static Subsearch some(Class<? extends Concept> c, O... params) {
ret new Subsearch(c, params);
}
static <A extends Concept> A searchConcept(MatchVar<A> var, O... params) {
assertNotNull(var.type); // must be typed to use in place of class
ret var.value = searchConcept(var.type, params);
}
static <A extends Concept> A searchConcept(Class<A> c, O... params) {
params = expandParams(c, params);
// First, go through all the concepts of the primary type.
for (A concept : list(c))
if (searchConcept_checkParams(concept, params))
ret concept; // Success!
null;
}
static <A extends Concept> L<A> searchConcept_all(Class<A> c, O... params) {
params = expandParams(c, params);
new L<A> l;
// First, go through all the concepts of the primary type.
for (A concept : list(c))
if (searchConcept_checkParams(concept, params))
l.add(concept); // Success!
ret l;
}
static bool searchConcept_checkParams(Concept c, O... params) {
for (int i = 0; i+1 < l(params); i += 2) {
S field = cast params[i];
O val = derefRef(params[i+1]);
O actual = cget(c, field);
if (val instanceof Subsearch) {
Subsearch s = cast val;
if (!isInstance(s.c, actual)) false; // wrong type
if (!searchConcept_checkParams((Concept) actual, s.params)) false; // bad params
} else if (val instanceof ISearchVar) {
ISearchVar v = cast val;
if (!v.set(actual)) false;
} else
if (neq(actual, val)) false;
}
true; // all params match
}
sbool actually(Class c, O... params) {
ret searchConcept(Actually, some(c, params)) != null;
}
/*sbool actually(MatchVar var, O... params) {
ret searchConcept(Actually, some(var, params)) != null;
}*/
/*static L<Concept> listActually(MatchVar var, O... params) {
ret map(func(Actually a) { a.what.get() }, searchConcept_all(Actually, some(var, params)));
}*/
static <A extends Concept> L<A> listActually(Class<A> c, O... params) {
ret map(func(Actually a) { a.what.get() }, searchConcept_all(Actually, some(c, params)));
}
static <A extends Concept> MatchVar<A> typedVar(Class<A> c) {
new MatchVar<A> var;
var.type = c;
ret var;
}Began life as a copy of #1005324
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1005328 |
| Snippet name: | searchConcept etc. |
| Eternal ID of this version: | #1005328/2 |
| Text MD5: | b33ee7e26652decbb03600d671ba2474 |
| Author: | stefan |
| Category: | javax / a.i. |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2021-08-05 22:34:09 |
| Source code size: | 2754 bytes / 94 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 799 / 1040 |
| Version history: | 1 change(s) |
| Referenced in: | [show references] |