abstractivator 0.3.1 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5b90ea5c5ad7ac821065c55b0141d0c3fc150e0
4
- data.tar.gz: 1143a6763ec08d757ae98ecda3d1b444e7cd1a9d
3
+ metadata.gz: fde467c865fb41d53a7c256fd150d5c2f3bbb947
4
+ data.tar.gz: 97e60569e7a56d45c24bafaf345f22856eb3b8c7
5
5
  SHA512:
6
- metadata.gz: 9e48495ea18d4ec76b1b9f9c95768995643ad77a02f36ed08dafcdc9c22e0d41cba293dbcfd3250598b5d1d0f0ecb408a097a6899fb7807757f19648ec9f292e
7
- data.tar.gz: 3f410933ce0c6f4c1d2d7eb69f8fbba241607731a524bce093fd62cc00f1547e3f7c4d492f67a7df770acbe2e29b16e0a04c826b954a9ce3a0b16af1e7196b98
6
+ metadata.gz: 1671b95d9e955f6ec00fc93972b6cea6b18311a0c0be80880010394c26fd3563c42d32228ceb8c500d463c4d95b567e4f48b03a88fdfea76d476ddd3b76f2535
7
+ data.tar.gz: 5655785a88eb97cd688bfbecf4923ce4f3db7074425e470c33d52143207d72681a49980cba7a44db07bfd592b37fa8a2abacab4463681403567776f83eba7450
@@ -0,0 +1,33 @@
1
+ class Enumerator
2
+ # @param state [Object] The initial state
3
+ # @yieldparam state [Object] the current state
4
+ # @yieldreturn [Array] a 2-element array containing the next value and the next state
5
+ def self.unfold(state)
6
+ raise 'block is required' unless block_given?
7
+ Enumerator.new do |y|
8
+ unless state.nil?
9
+ loop do
10
+ next_value, state = yield(state)
11
+ break if state.nil?
12
+ y << next_value
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ attr_accessor :__memo__, :__memo_instance__
19
+
20
+ def memoized
21
+ @__memo_instance__ ||= self.dup
22
+ inner = __memo_instance__
23
+ inner.__memo__ ||= []
24
+ Enumerator.new do |y|
25
+ i = 0
26
+ loop do
27
+ inner.__memo__ << inner.next while inner.__memo__.size <= i
28
+ y << inner.__memo__[i]
29
+ i += 1
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ require 'abstractivator/enumerator_ext'
2
+
3
+ module Numbers
4
+ def from(n, increment=1)
5
+ Enumerator.unfold(n) { |nxt| [nxt, nxt + increment] }
6
+ end
7
+
8
+ extend self
9
+ end
@@ -1,3 +1,3 @@
1
1
  module Abstractivator
2
- VERSION = '0.3.1'
2
+ VERSION = '0.4.0'
3
3
  end
@@ -0,0 +1,67 @@
1
+ require 'rspec'
2
+ require 'abstractivator/enumerator_ext'
3
+
4
+ describe 'Enumerator' do
5
+ describe '::unfold' do
6
+ it 'generates an enumerator based on state changes over time' do
7
+ naturals = Enumerator.unfold(1) { |nxt| [nxt, nxt + 1] }
8
+ expect(naturals.take(5)).to eql [1,2,3,4,5]
9
+ end
10
+ it 'stops when state becomes nil' do
11
+ xs = [1,2,3]
12
+ tails = Enumerator.unfold(xs) { |xs| xs.empty? ? [nil, nil] : [xs, xs.drop(1)] }
13
+ expect(tails.to_a).to eql [[1,2,3],[2,3],[3]]
14
+ end
15
+ it 'returns an empty array if the initial state is nil' do
16
+ expect(Enumerator.unfold(nil){}.to_a).to eql []
17
+ end
18
+ it 'raises an error if no block is provided' do
19
+ expect{Enumerator.unfold(nil)}.to raise_error
20
+ end
21
+ end
22
+
23
+ describe '#memoized' do
24
+ it 'returns a memoized version of the enumerator' do
25
+ work = []
26
+ naturals = Enumerator.new do |y|
27
+ i = 1
28
+ loop do
29
+ # puts "calculating #{i}"
30
+ work << i
31
+ y << i
32
+ i += 1
33
+ end
34
+ end
35
+
36
+ wrapped = naturals.memoized
37
+ expect(wrapped.take(3)).to eql [1,2,3]
38
+ expect(work).to eql [1,2,3]
39
+
40
+ # reenumerating doesn't do additional work
41
+ expect(wrapped.take(3)).to eql [1,2,3]
42
+ expect(work).to eql [1,2,3]
43
+
44
+ # enumerating more does the minimum amount of work
45
+ expect(wrapped.take(5)).to eql [1,2,3,4,5]
46
+ expect(work).to eql [1,2,3,4,5]
47
+
48
+ # subsequent calls share the memo
49
+ wrapped2 = naturals.memoized
50
+ expect(wrapped2.take(5)).to eql [1,2,3,4,5]
51
+ expect(work).to eql [1,2,3,4,5]
52
+
53
+ # wrapped instances are independent
54
+ a = naturals.memoized
55
+ b = naturals.memoized
56
+ expect(a.next).to eql 1
57
+ expect(a.next).to eql 2
58
+ expect(b.next).to eql 1
59
+ expect(a.next).to eql 3
60
+ expect(b.next).to eql 2
61
+
62
+ # wrapped enumerator is unaffected
63
+ expect(naturals.next).to eql 1
64
+ expect(naturals.take(3)).to eql [1,2,3]
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,14 @@
1
+ require 'rspec'
2
+ require 'abstractivator/numbers'
3
+
4
+ describe Numbers do
5
+ describe '::from' do
6
+ it 'returns a stream of numbers starting at the given number' do
7
+ expect(Numbers.from(1).take(3)).to eql [1,2,3]
8
+ end
9
+ it 'accepts an interval' do
10
+ expect(Numbers.from(0, 5).take(3)).to eql [0,5,10]
11
+ expect(Numbers.from(3, -1).take(3)).to eql [3,2,1]
12
+ end
13
+ end
14
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: abstractivator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Winton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-16 00:00:00.000000000 Z
11
+ date: 2015-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -114,8 +114,10 @@ files:
114
114
  - lib/abstractivator/cons.rb
115
115
  - lib/abstractivator/enum.rb
116
116
  - lib/abstractivator/enumerable_ext.rb
117
+ - lib/abstractivator/enumerator_ext.rb
117
118
  - lib/abstractivator/event.rb
118
119
  - lib/abstractivator/fiber_defer.rb
120
+ - lib/abstractivator/numbers.rb
119
121
  - lib/abstractivator/proc_ext.rb
120
122
  - lib/abstractivator/schedule.rb
121
123
  - lib/abstractivator/schedule/schedule.rb
@@ -132,8 +134,10 @@ files:
132
134
  - spec/lib/abstractivator/cons_spec.rb
133
135
  - spec/lib/abstractivator/enum_spec.rb
134
136
  - spec/lib/abstractivator/enumerable_ext_spec.rb
137
+ - spec/lib/abstractivator/enumerator_ext_spec.rb
135
138
  - spec/lib/abstractivator/event_spec.rb
136
139
  - spec/lib/abstractivator/fiber_defer_spec.rb
140
+ - spec/lib/abstractivator/numbers_spec.rb
137
141
  - spec/lib/abstractivator/proc_ext_spec.rb
138
142
  - spec/lib/abstractivator/schedule/em_util.rb
139
143
  - spec/lib/abstractivator/schedule/schedule_runner_spec.rb
@@ -172,8 +176,10 @@ test_files:
172
176
  - spec/lib/abstractivator/cons_spec.rb
173
177
  - spec/lib/abstractivator/enum_spec.rb
174
178
  - spec/lib/abstractivator/enumerable_ext_spec.rb
179
+ - spec/lib/abstractivator/enumerator_ext_spec.rb
175
180
  - spec/lib/abstractivator/event_spec.rb
176
181
  - spec/lib/abstractivator/fiber_defer_spec.rb
182
+ - spec/lib/abstractivator/numbers_spec.rb
177
183
  - spec/lib/abstractivator/proc_ext_spec.rb
178
184
  - spec/lib/abstractivator/schedule/em_util.rb
179
185
  - spec/lib/abstractivator/schedule/schedule_runner_spec.rb