1
2
3
4
5
6
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
33
34
35
36
37
class Class
  def __clean__
    instance_methods.each do |meth|
      next if ["__send__", "__id__"].include? meth
      define_method("__#{meth}__".to_sym, instance_method(meth))
      undef_method meth
    end
  end
end

class Future

  __clean__
  
  def initialize(&b)
    @available = false
    @value     = nil
    @thread    = Thread.new { @value = b.call; @available = true }
  end
  
  def method_missing(name, *args, &block)
    if @available
      @value.send(name, *args, &block)
    else
      Future.new { __join__; send name, *args, &block }
    end
  end
  
  def __join__
    @thread.join
  end
  
  def __demand__
    join
    @value
  end
end