A glimpse of a promising future in which ruby supports delayed execution
Switch branches/tags
Clone or download
philipmw Merge pull request #26 from philipmw/rubinius
Fix marshaling on Rubinius; add Rubinius to auto-tested Rubies
Latest commit 2ee99b6 Dec 12, 2015


Promising Future

A glimpse of a promising future in which Ruby supports lazy evaluation.


Promises and futures both transparently defer the execution of a block. Promises evaluate the given block if and when its result is first needed. Futures evaluate the given block optimistically in another thread.

    require 'promise'
    require 'future'    # you can just require 'future' if using both

    x = promise { 1 + 2 }
    y = future  { sleep(10) && 6 * 7 }

    puts x      #=> 3
    sleep 5     # ... do work for 5 seconds ...
    puts y      #=> 42, after blocking 5 seconds

Note that this is pretty useless in Ruby's interactive shell irb, as it will eagerly evaluate everything as part of its read-eval-print loop, forcing promises and futures to yield their results.

If you still want to test in irb you can try something like this:

    x = promise { sleep(5) && 6 * 7 }; nil
    # do some work
    x + 1 # block for 5 seconds

The library is automatically tested with Travis CI and aims to support a wide range of Ruby interpreters.

Build Status Coverage Status

YARD documentation is available at http://promise.rubyforge.org/


  • {Promise}
  • {Future}


The library is distributed via RubyGems:

    $ gem install promise


The source is available at http://github.com/bhuga/promising-future


Ben Lavender


Promising Future is free and unencumbered public domain software. For more information, see http://unlicense.org/ or the accompanying UNLICENSE file.