srecord noeq StupidFib_collab(ICollab collab, int n) { // if n <= parallelizationThreshold, we calculate serially gettable int parallelizationThreshold = 8; selfType parallelizationThreshold(int x) { parallelizationThreshold = max(3, x); this; } record noeq Step(int n, LongConsumer continuation) extends LongPairCollector is Runnable { void complete(long a, long b) { continuation.accept(a+b); } run { // fallback to serial case if (n < parallelizationThreshold) ret with continuation.accept(serialComputation(n)); collab.addWork(new Step(n-1, setterForA())); collab.addWork(new Step(n-2, setterForB())); } } long serialComputation(int n) { ret stupidFib(n); } long get() { // serial or parallel? if (collab.coresToUse() == 1) ret serialComputation(n); else ret collab_computeLong(collab, receiver -> new Step(n, receiver)); } }