static Dispatch() { ProcessName broadcast = "broadcast"; ProcessName leastBusy = "least-busy"; ProcessName random = "random"; ProcessName roundRobin = "round-robin"; ProcessName first = "first"; ProcessName second = "second"; ProcessName third = "third"; ProcessName last = "last"; var processes = fun((ProcessId leaf) => { if (!leaf.IsValid) { return(new ProcessId[0]); } if (leaf.IsSelection) { return(leaf.GetSelection()); } if (leaf.Head().GetName() == "disp") { leaf = leaf.Skip(1); if (!leaf.IsValid) { return(new ProcessId[0]); } return(ActorContext.GetDispatcherFunc(leaf.Head().GetName())(leaf.Skip(1))); } return(new ProcessId[1] { leaf }); }); // Broadcast Broadcast = register(broadcast, processes); // First First = register(first, leaf => processes(leaf).Take(1)); // Second Second = register(second, leaf => processes(leaf).Skip(1).Take(1)); // Third Third = register(third, leaf => processes(leaf).Skip(2).Take(1)); // Last Last = register(last, leaf => processes(leaf).Reverse().Take(1)); // Least busy LeastBusy = register(leastBusy, leaf => processes(leaf) .Map(pid => Tuple(inboxCount(pid), pid)) .OrderBy(tup => tup.Item1) .Map(tup => tup.Item2) .Take(1)); // Random Random = register(random, leaf => { var workers = processes(leaf).ToArray(); return(new ProcessId[1] { workers[Prelude.random(workers.Length)] }); }); // Round-robin object sync = new object(); Map <string, int> roundRobinState = Map.empty <string, int>(); RoundRobin = register(roundRobin, leaf => { var key = leaf.ToString(); var workers = processes(leaf).ToArray(); int index = 0; lock (sync) { roundRobinState = roundRobinState.AddOrUpdate(key, x => { index = x % workers.Length; return(x + 1); }, 0); } return(new ProcessId[1] { workers[index] }); }); }