Module: Ori::Select

Defined in:
lib/ori/select.rb

Class Method Summary collapse

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