package jetbrains.mps.baseLanguage.scopes;
/*Generated by MPS */
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.smodel.ModelAccess;
import java.util.concurrent.ConcurrentMap;
import jetbrains.mps.smodel.NodeReadAccessCasterInEditor;
import jetbrains.mps.util.Computable;
public class RepositoryStateCacheUtils {
public static <K, V> V getFromCache(String repositoryKey, K key, final _FunctionTypes._return_P0_E0<? extends V> creator) {
if (ModelAccess.instance().canWrite()) {
return creator.invoke();
}
ConcurrentMap<K, V> cache = ModelAccess.instance().getRepositoryStateCache(repositoryKey);
if (cache == null) {
return creator.invoke();
}
V v = cache.get(key);
if (v != null) {
return v;
}
v = NodeReadAccessCasterInEditor.runReadTransparentAction(new Computable<V>() {
@Override
public V compute() {
return creator.invoke();
}
});
if (v != null) {
cache.putIfAbsent(key, v);
}
return v;
}
public static <K, V> V getFromCache(Class clazz, K key, final _FunctionTypes._return_P0_E0<? extends V> creator) {
return getFromCache(clazz.getName(), key, creator);
}
}