sclass WeakValueMap {
// A value that has been stored with this key has been garbage
// collected.
event valueForKeyReleased(A key);
// internal
Map> map = syncMap();
RunnablesReferenceQueue queue;
class MyRef extends WeakRef is Runnable {
A key;
*(A *key, B value) { super(value, queue()!); }
run {
syncMapRemoveKeyAndValuePair(map, key, value);
valueForKeyReleased(key);
}
}
// public methods follow
B get(A key) {
ret getWeakRef(map.get(key));
}
B put(A key, B value) {
map.put(key, value == null ?: new MyRef(value));
}
O mutex() { ret collectionMutex(map); }
RunnablesReferenceQueue queue() {
synchronized(mutex()) {
if (queue == null) queue = new RunnablesReferenceQueue;
ret queue;
}
}
}