Skip to content

Instantly share code, notes, and snippets.

@lennyburdette
Created March 18, 2014 02:31
Show Gist options
  • Save lennyburdette/9612536 to your computer and use it in GitHub Desktop.
Save lennyburdette/9612536 to your computer and use it in GitHub Desktop.
require 'concurrent'
class Observer
attr_reader :key
def initialize(event, key)
@event = event
@key = key
@finished = false
end
def finished?
@finished == true
end
def update(time, value, reason)
@finished = true
@event.set
end
end
foo = Concurrent::Future.new do
sleep(5)
:foo
end
bar = Concurrent::Future.new do
sleep(1)
:bar
end
group = { foo: foo, bar: bar }
group_observer = Concurrent::Future.new do
event = Concurrent::Event.new
observers = group.map do |key, future|
Observer.new(event, key).tap { |o| future.add_observer(o) }
end
event.wait
group[observers.select(&:finished?).first.key].value
end
[*group.values, group_observer].map(&:execute)
group_observer.value
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment