Module: Ori::Select
- Defined in:
- lib/ori/select.rb
Class Method Summary collapse
-
.await(resources) ⇒ Object
: [U] (Array[U & Selectable] resources) -> U.
Class Method Details
.await(resources) ⇒ Object
: [U] (Array[U & Selectable] resources) -> U
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/ori/select.rb', line 7 def await(resources) # TODO: Check if any resources are already resolved # before spawning fibers winner = Promise.new Ori.sync(name: "select") do |scope| # TODO: use pattern match against Ori::Task here # instead of Ori::Promise? scope.fork_each(resources) do |resource| case resource when Ori::Timeout # Timeout returns nil if it was cancelled winner.resolve(resource) if resource.await when Ori::Selectable # Ori::Promise, Ori::Task, Ori::Channel, Ori::Semaphore resource.await winner.resolve(resource) else raise "Unsupported await type: #{resource.class}" end scope.shutdown! end end winner.await end |