// not synchronized sclass WebThoughtSpace extends OptionalConcept { S globalID; new Webs webs; new L openQuestions; transient Map websByID; transient MultiMap index; class Webs extends NotifyingList { *() { super(new L); } *(L l) { super(l); } public synchronized bool add(Web web) { synchronized(this) { if (!list.add(e)) false; } if (index != null) ai_addWebToIndex(index, web); if (websByID != null) websByID.put(web.globalID, web); } void change() { index = null; websByID = null; } public synchronized L subList(int i, int j) { ret new Webs(list.subList(i, j)); } } *() {} *(Web... webs) { addAll(this.webs, webs); } void addWeb(Web web) { webs.add(web); } WebNode indexedNode(S query) { ret first(indexedNodes(query)); } L indexedNodes(S query) { if (index == null) index = ai_indexWebs(webs); ret index.get(query); } }