This module offers asynchronous programming helpers, especially execution context agnostic promises and futures. The provided APIs are orthogonal to the execution strategy: it is up to you to execute code from the same thread, from a separate thread, or by pushing new tasks to a service executor.
Here is an example:
module samples.Concurrency import java.util.concurrent import gololang.Async local function fib = |n| { if n <= 1 { return n } else { return fib(n - 1) + fib(n - 2) } } function main = |args| { let executor = Executors.newFixedThreadPool(2) let results = [30, 34, 35, 38, 39, 40, 41, 42]: map(|n| -> executor: enqueue(-> fib(n)): map(|res| -> [n, res])) reduce(results, "", |acc, next| -> acc + next: get(0) + " -> " + next: get(1) + "\n"): onSet(|s| -> println("Results:\n" + s)): onFail(|e| -> e: printStackTrace()) executor: shutdown() executor: awaitTermination(120_L, TimeUnit.SECONDS()) }
This example takes advantages of an executor augmentation and composable promises and futures to compute Fibonacci numbers.