futures 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (5) hide show
  1. data/README.rdoc +29 -0
  2. data/Rakefile +14 -0
  3. data/VERSION +1 -0
  4. data/lib/futures.rb +50 -0
  5. metadata +58 -0
@@ -0,0 +1,29 @@
1
+ = Futures
2
+
3
+ require 'futures'
4
+
5
+ class ITakeALongTime
6
+ include Futures
7
+
8
+ future :test
9
+
10
+ def initialize
11
+ Thread.new {
12
+ sleep 10
13
+ self.test = 123
14
+ }
15
+ end
16
+
17
+ end
18
+
19
+ n = ITakeALongTime.new
20
+ puts n.test
21
+
22
+ val = Futures::Value.new
23
+
24
+ Thread.new do
25
+ sleep 5
26
+ val.write('hello you')
27
+ end
28
+
29
+ puts "val.read is #{val.read(10)}"
@@ -0,0 +1,14 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |s|
4
+ s.name = "futures"
5
+ s.description = s.summary = "Reading values that aren't quite set yet."
6
+ s.email = "joshbuddy@gmail.com"
7
+ s.homepage = "http://github.com/joshbuddy/futures"
8
+ s.authors = ["Joshua Hull"]
9
+ s.files = FileList["[A-Z]*", "{lib}/**/*"]
10
+ end
11
+ Jeweler::GemcutterTasks.new
12
+ rescue LoadError
13
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
14
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,50 @@
1
+ module Futures
2
+
3
+ class Value
4
+
5
+ TimeoutError = Class.new(RuntimeError)
6
+
7
+ def read(timeout = nil)
8
+ unless @value
9
+ @write = Thread.new { Thread.stop }
10
+ @write.join(timeout) or raise(TimeoutError.new)
11
+ end
12
+ @value
13
+ end
14
+
15
+ def write(value)
16
+ @value = value
17
+ @write.wakeup if @write
18
+ end
19
+ end
20
+
21
+ def self.included(cls)
22
+ cls.class_eval "
23
+ class << self
24
+ include Futures::ClassMethods
25
+ end
26
+ "
27
+ end
28
+
29
+ module ClassMethods
30
+ def future(*attrs)
31
+ attrs.each do |attr|
32
+ self.class_eval "
33
+ def #{attr}(timeout = nil)
34
+ @__#{attr}_future ||= Futures::Value.new
35
+ @__#{attr}_future.read(timeout)
36
+ end
37
+
38
+ def #{attr}=(val)
39
+ @__#{attr}_future ||= Futures::Value.new
40
+ @__#{attr}_future.write(val)
41
+ end
42
+
43
+ "
44
+ end
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: futures
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Joshua Hull
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-27 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Reading values that aren't quite set yet.
17
+ email: joshbuddy@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README.rdoc
24
+ files:
25
+ - README.rdoc
26
+ - Rakefile
27
+ - VERSION
28
+ - lib/futures.rb
29
+ has_rdoc: true
30
+ homepage: http://github.com/joshbuddy/futures
31
+ licenses: []
32
+
33
+ post_install_message:
34
+ rdoc_options:
35
+ - --charset=UTF-8
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.3.5
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: Reading values that aren't quite set yet.
57
+ test_files: []
58
+