sclass ActualThoughtSpace extends AbstractThoughtSpace { new TripleIndex index; int limit; // 0 = no limit Map blocked = newWeakHashMap(); Set blockedA; *() {} *(int *limit) {} *(AbstractThoughtSpace parent) { super(parent); } // existence of triple has already been checked public GlobalID postTriple(T3 t) { if (limitReached()) fail("Thought space limit reached"); TripleWeb w = tripleWeb(t); index.addTriple(w); ret w.globalID(); } bool limitReached() { ret limit > 0 && size() >= limit; } L> get(S s) { ret ai_triplesToTripleRefs_lazyList(s, getTriples(s)); } L getTriples(S s) { L l = filterNonBlockedTriples_lazy(parent.getTriples(s)); ret combineLists(l, index.getTriples(ai_shortenForIndex(s))); } L filterNonBlockedTriples_lazy(final L l) { class FilterList extends LazyList { final int n = l(l); public int size() { ret n; } public TripleWeb get(int i) { TripleWeb w = syncGet(l, i); if (w != null && isBlocked(w)) null; ret w; } } ret new FilterList; } L filterNonBlockedTriples(L l) { if (empty(blockedA)) ret l; L out = emptyListWithCapacity(l); for (TripleWeb w : l) if (!isBlocked(w)) out.add(w); ret out; } bool isBlocked(TripleWeb t) { ret contains(blockedA, t.a); } int size() { ret index.size(); } }