lib/future.rb in promise-0.1.1 vs lib/future.rb in promise-0.2.0
- old
+ new
@@ -4,46 +4,63 @@
# A delayed-execution result, optimistcally evaluated in a new Thread.
# @example
# x = future { sleep 5; 1 + 2 }
# # do stuff...
# y = x * 2 # => 6. blocks unless 5 seconds has passed.
-#
+#
class Future < defined?(BasicObject) ? BasicObject : Object
- instance_methods.each { |m| undef_method m unless m =~ /__|object_id/ } unless defined?(BasicObject)
-
+ instance_methods.each { |m| undef_method m unless m =~ /__/ } unless defined?(BasicObject)
+
##
- # @param [Proc] block
+ # Create a new future
+ #
+ # @yield [] The block to evaluate optimistically
# @return [Future]
def initialize(block)
@promise = promise &block
@thread = ::Thread.new do
@promise.force
end
end
##
# The value of the future's evaluation. Blocks until result available.
+ #
# @return [Any]
- def force
+ def __force__
@thread.join
@promise
end
+ alias_method :force, :__force__
+ ##
+ # Does this promise support the given method?
+ #
+ # @param [Symbol]
+ # @return [true, false]
+ def respond_to?(method)
+ (method == :force) || (method == :__force__) || (__force__.respond_to?(method))
+ end
+
# @private
def method_missing(method, *args, &block)
- @promise.send(method, *args, &block)
+ @promise.send(method, *args, &block)
end
end
module Kernel
- # Create a new future
- # @example
+ # Create a new future
+ #
+ # @example Evaluate an operation in another thread
# x = future { 3 + 3 }
+ # @return [Future]
+ # @yield [] A block to be optimistically evaluated in another thread
+ # @yieldreturn [Any] The return value of the block will be the evaluated value of the future.
def future(&block)
Future.new(block)
end
end