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.
- data/README.rdoc +29 -0
- data/Rakefile +14 -0
- data/VERSION +1 -0
- data/lib/futures.rb +50 -0
- metadata +58 -0
data/README.rdoc
ADDED
|
@@ -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)}"
|
data/Rakefile
ADDED
|
@@ -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
|
data/lib/futures.rb
ADDED
|
@@ -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
|
+
|