X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.runtime%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fruntime%2Flazy%2FLazy.java;fp=bundles%2Forg.simantics.scl.runtime%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fruntime%2Flazy%2FLazy.java;h=0c53fc97ac8619065ed5f507d3c8e437794a1aa7;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/lazy/Lazy.java b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/lazy/Lazy.java new file mode 100644 index 000000000..0c53fc97a --- /dev/null +++ b/bundles/org.simantics.scl.runtime/src/org/simantics/scl/runtime/lazy/Lazy.java @@ -0,0 +1,37 @@ +package org.simantics.scl.runtime.lazy; + +import org.simantics.scl.runtime.function.Function; +import org.simantics.scl.runtime.function.FunctionImpl1; +import org.simantics.scl.runtime.tuple.Tuple0; + +public class Lazy { + private static final Function CYCLIC_EVALUATION_TRAP = new FunctionImpl1() { + @Override + public Object apply(Object p0) { + throw new RuntimeException("Cyclic dependency on lazy value."); + } + }; + + volatile Function thunk; + volatile Object value; + + public Lazy(Function thunk) { + this.thunk = thunk; + } + + public Object force() { + if(thunk == null) + return value; + else { + synchronized(this) { + Function curThunk = thunk; + if(curThunk != null) { + thunk = CYCLIC_EVALUATION_TRAP; + value = curThunk.apply(Tuple0.INSTANCE); + thunk = null; + } + } + return value; + } + } +}