srecord noeq StupidFib_collab(ICollab collab, int n) { // if n <= parallelizationThreshold, we calculate serially settable int parallelizationThreshold = 24; // main calculation function // (if one core, go serial, otherwise parallelize) long get() { if (collab.coresToUse() == 1) ret serialComputation(n); else ret collab_computeLong(collab, receiver -> new Step(n, receiver)); } // serial version long serialComputation(int n) { ret stupidFib(n); } // individual calculation step for parallel version record noeq Step(int n, LongConsumer continuation) extends LongPairCollector is Runnable { // if below parallelization threshold, go serial, otherwise parallelize run { if (n < max(3, parallelizationThreshold)) continuation.accept(serialComputation(n)); else { collab.addWork(new Step(n-1, setterForA())); collab.addWork(new Step(n-2, setterForB())); } } // calculate and forward result when subcomputations have completed void complete(long a, long b) { continuation.accept(a+b); } } }