futures 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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
+