futuroscope 0.0.2 → 0.0.3

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 44424db4bac133c4e8e4009403b02d0ecc750956
4
+ data.tar.gz: e38c304ced43c047b82c4f9c24d414fb8c5813d3
5
+ SHA512:
6
+ metadata.gz: 370dd490ff6939491f44c5860caa2c48be493650c3e2ec56d6fed74194da915e20b36e53d8025141ba695e005b102328047c1e259b72c9bd5912ffc6e8b6f98a
7
+ data.tar.gz: 3e4e2723daaa6c0e088fc71da56149472ced8d4b08220e7ec3acf3bfa2e8e4c870ef32bd1eae6b9a42e7476991cf6fb0156bf1ef8871bef66b6fabeadc9a31a9
data/README.md CHANGED
@@ -41,6 +41,7 @@ Or install it yourself as:
41
41
 
42
42
  ## Usage
43
43
 
44
+ ### Simple futures
44
45
  ```Ruby
45
46
  require 'futuroscope'
46
47
 
@@ -55,6 +56,29 @@ puts x + y + z
55
56
  => 6
56
57
  ```
57
58
 
59
+ ### Future map
60
+ ```Ruby
61
+ require 'futuroscope'
62
+
63
+ map = Futuroscope::Map.new([1, 2, 3]).map do |i|
64
+ sleep(1)
65
+ i + 1
66
+ end
67
+
68
+ puts map.first
69
+ => 2
70
+
71
+ puts map[1]
72
+ => 3
73
+
74
+ puts map.last
75
+ => 4
76
+
77
+ # This action will actually only take 1 second.
78
+ ```
79
+
80
+ ### Convenience methods
81
+
58
82
  If you don't mind polluting the `Kernel` module, you can also require
59
83
  futuroscope's convenience `future` method:
60
84
 
@@ -69,6 +93,30 @@ puts x + y + z
69
93
  => 6
70
94
  ```
71
95
 
96
+ Same for a map:
97
+
98
+ ```Ruby
99
+ require 'futuroscope/convenience'
100
+
101
+ items = [1, 2, 3].future_map do |i|
102
+ sleep(i)
103
+ i + 1
104
+ end
105
+ ```
106
+
107
+ ## Considerations
108
+
109
+ You should never add **side-effects** to a future. They have to be thought of
110
+ like they were a local variable, with the only outcome that they're returning a
111
+ value.
112
+
113
+ You have to take into account that they really run in a different thread, so
114
+ you'll be potentially accessing code in parallel that could not be threadsafe.
115
+
116
+ If you're looking for other ways to improve your code performance via
117
+ concurrency, you should probably deal directly with [Ruby's
118
+ threads](http://ruby-doc.org/core-2.0/Thread.html).
119
+
72
120
  ## Ideas for the future
73
121
 
74
122
  * Having a thread pool so you can limit maximum concurrency.
@@ -5,7 +5,7 @@ module Futuroscope
5
5
  # and will return it instantly if the thread's execution already finished.
6
6
  #
7
7
  class Future
8
- attr_writer :__value
8
+ attr_writer :future_value
9
9
  extend Forwardable
10
10
 
11
11
  # Initializes a future with a block and starts its execution.
@@ -27,7 +27,7 @@ module Futuroscope
27
27
 
28
28
  @thread = Thread.new do
29
29
  result = block.call
30
- self.__value = result
30
+ self.future_value = result
31
31
  end
32
32
  end
33
33
 
@@ -35,29 +35,29 @@ module Futuroscope
35
35
  # completed or return its value otherwise. Can be called multiple times.
36
36
  #
37
37
  # Returns the Future's block execution result.
38
- def __value
38
+ def future_value
39
39
  @mutex.synchronize do
40
- return @__value if defined?(@__value)
40
+ return @future_value if defined?(@future_value)
41
41
  end
42
42
  @thread.join
43
- @__value
43
+ @future_value
44
44
  end
45
45
 
46
- def_delegators :__value, :to_s, :==
46
+ def_delegators :future_value, :to_s, :==, :kind_of?, :is_a?, :clone, :class
47
47
 
48
48
  private
49
49
 
50
50
  def method_missing(method, *args)
51
- __value.send(method, *args)
51
+ future_value.send(method, *args)
52
52
  end
53
53
 
54
54
  def respond_to_missing?(method, include_private = false)
55
- __value.respond_to?(method, include_private)
55
+ future_value.respond_to?(method, include_private)
56
56
  end
57
57
 
58
- def __value=(value)
58
+ def future_value=(value)
59
59
  @mutex.synchronize do
60
- @__value = value
60
+ @future_value = value
61
61
  end
62
62
  end
63
63
  end
@@ -25,15 +25,5 @@ module Futuroscope
25
25
  end
26
26
  end
27
27
  end
28
-
29
- private
30
-
31
- def method_missing(method, *args)
32
- @map.send(method, *args)
33
- end
34
-
35
- def respond_to_missing?(method, include_private = false)
36
- @map.respond_to?(method, include_private)
37
- end
38
28
  end
39
29
  end
@@ -1,3 +1,3 @@
1
1
  module Futuroscope
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -19,5 +19,16 @@ module Futuroscope
19
19
  expect(future).to eq(:edballs)
20
20
  end
21
21
  end
22
+
23
+ it "delegates some important methods to the original object's" do
24
+ object = [1, 2, 3]
25
+ future = Future.new{object}
26
+
27
+ expect(future.class).to eq(Array)
28
+ expect(future).to be_kind_of(Enumerable)
29
+ expect(future).to be_a(Enumerable)
30
+ expect(future.clone).to eq(object)
31
+ expect(future.to_s).to eq(object.to_s)
32
+ end
22
33
  end
23
34
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: futuroscope
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.0.3
6
5
  platform: ruby
7
6
  authors:
8
7
  - Josep Jaume Rey Peroy
@@ -13,52 +12,46 @@ date: 2013-05-03 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: bundler
16
- version_requirements: !ruby/object:Gem::Requirement
15
+ requirement: !ruby/object:Gem::Requirement
17
16
  requirements:
18
17
  - - ~>
19
18
  - !ruby/object:Gem::Version
20
19
  version: '1.3'
21
- none: false
22
- requirement: !ruby/object:Gem::Requirement
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
- none: false
28
- prerelease: false
29
- type: :development
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
- version_requirements: !ruby/object:Gem::Requirement
33
- requirements:
34
- - - ! '>='
35
- - !ruby/object:Gem::Version
36
- version: '0'
37
- none: false
38
29
  requirement: !ruby/object:Gem::Requirement
39
30
  requirements:
40
- - - ! '>='
31
+ - - '>='
41
32
  - !ruby/object:Gem::Version
42
33
  version: '0'
43
- none: false
44
- prerelease: false
45
34
  type: :development
46
- - !ruby/object:Gem::Dependency
47
- name: rspec
35
+ prerelease: false
48
36
  version_requirements: !ruby/object:Gem::Requirement
49
37
  requirements:
50
- - - ! '>='
38
+ - - '>='
51
39
  - !ruby/object:Gem::Version
52
40
  version: '0'
53
- none: false
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
54
43
  requirement: !ruby/object:Gem::Requirement
55
44
  requirements:
56
- - - ! '>='
45
+ - - '>='
57
46
  - !ruby/object:Gem::Version
58
47
  version: '0'
59
- none: false
60
- prerelease: false
61
48
  type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
62
55
  description: Futuroscope is yet another simple gem that implements the Futures concurrency
63
56
  pattern.
64
57
  email:
@@ -67,84 +60,53 @@ executables: []
67
60
  extensions: []
68
61
  extra_rdoc_files: []
69
62
  files:
70
- - !binary |-
71
- LmdpdGlnbm9yZQ==
72
- - !binary |-
73
- LnJzcGVj
74
- - !binary |-
75
- LnJ1YnktZ2Vtc2V0
76
- - !binary |-
77
- LnJ1YnktdmVyc2lvbg==
78
- - !binary |-
79
- LnRyYXZpcy55bWw=
80
- - !binary |-
81
- R2VtZmlsZQ==
82
- - !binary |-
83
- R3VhcmRmaWxl
84
- - !binary |-
85
- TElDRU5TRS50eHQ=
86
- - !binary |-
87
- UkVBRE1FLm1k
88
- - !binary |-
89
- UmFrZWZpbGU=
90
- - !binary |-
91
- ZnV0dXJvc2NvcGUuZ2Vtc3BlYw==
92
- - !binary |-
93
- bGliL2Z1dHVyb3Njb3BlLnJi
94
- - !binary |-
95
- bGliL2Z1dHVyb3Njb3BlL2NvbnZlbmllbmNlLnJi
96
- - !binary |-
97
- bGliL2Z1dHVyb3Njb3BlL2Z1dHVyZS5yYg==
98
- - !binary |-
99
- bGliL2Z1dHVyb3Njb3BlL21hcC5yYg==
100
- - !binary |-
101
- bGliL2Z1dHVyb3Njb3BlL3ZlcnNpb24ucmI=
102
- - !binary |-
103
- c3BlYy9mdXR1cm9zY29wZS9jb252ZW5pZW5jZV9zcGVjLnJi
104
- - !binary |-
105
- c3BlYy9mdXR1cm9zY29wZS9mdXR1cmVfc3BlYy5yYg==
106
- - !binary |-
107
- c3BlYy9mdXR1cm9zY29wZS9tYXBfc3BlYy5yYg==
108
- - !binary |-
109
- c3BlYy9zcGVjX2hlbHBlci5yYg==
63
+ - .gitignore
64
+ - .rspec
65
+ - .ruby-gemset
66
+ - .ruby-version
67
+ - .travis.yml
68
+ - Gemfile
69
+ - Guardfile
70
+ - LICENSE.txt
71
+ - README.md
72
+ - Rakefile
73
+ - futuroscope.gemspec
74
+ - lib/futuroscope.rb
75
+ - lib/futuroscope/convenience.rb
76
+ - lib/futuroscope/future.rb
77
+ - lib/futuroscope/map.rb
78
+ - lib/futuroscope/version.rb
79
+ - spec/futuroscope/convenience_spec.rb
80
+ - spec/futuroscope/future_spec.rb
81
+ - spec/futuroscope/map_spec.rb
82
+ - spec/spec_helper.rb
110
83
  homepage: ''
111
84
  licenses:
112
85
  - MIT
86
+ metadata: {}
113
87
  post_install_message:
114
88
  rdoc_options: []
115
89
  require_paths:
116
90
  - lib
117
91
  required_ruby_version: !ruby/object:Gem::Requirement
118
92
  requirements:
119
- - - ! '>='
93
+ - - '>='
120
94
  - !ruby/object:Gem::Version
121
95
  version: '0'
122
- segments:
123
- - 0
124
- hash: 2002549777813010636
125
- none: false
126
96
  required_rubygems_version: !ruby/object:Gem::Requirement
127
97
  requirements:
128
- - - ! '>='
98
+ - - '>='
129
99
  - !ruby/object:Gem::Version
130
100
  version: '0'
131
- segments:
132
- - 0
133
- hash: 2002549777813010636
134
- none: false
135
101
  requirements: []
136
102
  rubyforge_project:
137
- rubygems_version: 1.8.25
103
+ rubygems_version: 2.0.2
138
104
  signing_key:
139
- specification_version: 3
105
+ specification_version: 4
140
106
  summary: Futuroscope is yet another simple gem that implements the Futures concurrency
141
107
  pattern.
142
108
  test_files:
143
- - !binary |-
144
- c3BlYy9mdXR1cm9zY29wZS9jb252ZW5pZW5jZV9zcGVjLnJi
145
- - !binary |-
146
- c3BlYy9mdXR1cm9zY29wZS9mdXR1cmVfc3BlYy5yYg==
147
- - !binary |-
148
- c3BlYy9mdXR1cm9zY29wZS9tYXBfc3BlYy5yYg==
149
- - !binary |-
150
- c3BlYy9zcGVjX2hlbHBlci5yYg==
109
+ - spec/futuroscope/convenience_spec.rb
110
+ - spec/futuroscope/future_spec.rb
111
+ - spec/futuroscope/map_spec.rb
112
+ - spec/spec_helper.rb