lab42_streams 0.1.3 → 0.2.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: d09f7787dde8a103ab385e107f3edfb91cab85cb
4
- data.tar.gz: 2fcdf2c0ea44003310d0e05d7df2716a4d1d5ff5
3
+ metadata.gz: d8d00b456b8ce625579e3dc38bf492d5f10f33c8
4
+ data.tar.gz: a454254eb45b9315675e2d64379186c9b3e7b71b
5
5
  SHA512:
6
- metadata.gz: 3d87e2f2e764b300379b879ce4a2f7716abfab0d6b56d5894e25e13d7d663d8a571c8e9623a092c22de34315624b6398becac64e3ac29cfa9445453f46d6f999
7
- data.tar.gz: df8e4190c2c63dfb1e238e6c60483af3c5b90385248a0117411f40cd77aed7c6f0a274ec102f89b5943caa5ee641e9dea7ef151fb7c4ae8ed8c7af24830baf0b
6
+ metadata.gz: a9da27d1e87aae306204fe530f480aef2196de0c33aa18b0f3967a51230a838dc741c78861d7d4cd25da32edc0d134a894bc38672c40c5833209c4fff81ce4c7
7
+ data.tar.gz: 89ae1665b491b160b0c58338b3f4c1bc9eeae3cf0d9545456d6f2ef05670b14dd1ce9d47bd460a5493eeb3bedb0559d87b6eee8b2b2324d68078bdb5db6e5cc6
data/README.md CHANGED
@@ -11,6 +11,4 @@ An excellent introduction into `Streams` can be found [here](http://ocw.mit.edu/
11
11
 
12
12
 
13
13
 
14
- Please see the [QED](http://rubyworks.github.io/qed/) demos [here](https://github.com/RobertDober/lab42_streams/blob/master/demo)
15
-
16
- for details.
14
+ Please see the [QED](http://rubyworks.github.io/qed/) demos [here](https://github.com/RobertDober/lab42_streams/blob/master/demo) for details.
@@ -5,12 +5,10 @@ require_relative './stream/kernel'
5
5
  require_relative './stream/array'
6
6
  require_relative './stream/enumerable'
7
7
  require_relative './stream/higher_order'
8
- require_relative './stream/hash'
9
8
  require_relative './stream/proc'
10
9
  require_relative './stream/class_methods'
11
10
  require_relative './stream/utility'
12
11
 
13
- # TODO: This should rather be implemented in lab_42/core/fn
14
12
  require_relative './stream/kernel/extensions'
15
13
 
16
14
  module Lab42
@@ -31,7 +29,7 @@ module Lab42
31
29
  def combine_streams *args, &operation
32
30
  op = args.shift unless self.class === args.first
33
31
  raise ArgumentError, "Missing stream parameters" if args.empty?
34
- __combine_streams__ operation.make_behavior( op ), args
32
+ __combine_streams__ Behavior.make( op, &operation), args
35
33
  end
36
34
 
37
35
  def drop n = 1
@@ -53,10 +51,10 @@ module Lab42
53
51
  def to_stream; self end
54
52
 
55
53
  def __combine_streams__ op, args
56
- return empty_stream if args.any?(&sendmsg(:empty?))
54
+ return empty_stream if args.any?(&:empty?)
57
55
 
58
- new_head = op.(head, *args.map(&sendmsg(:head)))
59
- cons_stream( new_head ){ tail.__combine_streams__(op, args.map(&sendmsg(:tail))) }
56
+ new_head = op.(head, *args.map(&:head))
57
+ cons_stream( new_head ){ tail.__combine_streams__(op, args.map(&:tail)) }
60
58
  end
61
59
 
62
60
  private
@@ -0,0 +1,62 @@
1
+ require 'lab42/core/hash'
2
+
3
+ module Lab42
4
+ class Stream
5
+ class Behavior
6
+
7
+ def initialize( &blk )
8
+ @behavior = blk
9
+ end
10
+
11
+ def call( *args )
12
+ @behavior.( *args )
13
+ end
14
+
15
+ class << self
16
+
17
+ def const(const_rval)
18
+ __const_hash__.fetch!(const_rval, new{ |*_| const_rval})
19
+ end
20
+
21
+ def make(*args, &blk)
22
+ if blk
23
+ raise ArgumentError, "cannot specify behavior with block and args: #{args.inspect}" unless args.empty?
24
+ blk
25
+ else
26
+ _make_from_args( args )
27
+ end
28
+ end
29
+
30
+ def make1(*args, &blk)
31
+ if blk
32
+ blk
33
+ else
34
+ _make_from_args( args )
35
+ end
36
+ end
37
+ private
38
+
39
+ def _make_from_args( args )
40
+ if args.first.respond_to?( :call )
41
+ _curry( args )
42
+ else
43
+ -> (rcv, *a) do
44
+ rcv.send(*(args + a))
45
+ end
46
+ end
47
+ end
48
+
49
+ def _curry(args)
50
+ -> ( *a ) do
51
+ args.first.(*(args.drop(1)+a))
52
+ end
53
+ end
54
+
55
+ def __const_hash__
56
+ @__const_hash__ ||= {}
57
+ end
58
+
59
+ end
60
+ end
61
+ end
62
+ end
@@ -2,7 +2,7 @@ module Lab42
2
2
  class Stream
3
3
  module ClassMethods
4
4
  def iterate arg, beh=nil, &blk
5
- beh = blk.make_behavior beh
5
+ beh = Behavior.make( beh, &blk)
6
6
  __iterate__ arg, beh
7
7
  end
8
8
 
@@ -1,17 +1,11 @@
1
1
  module Enumerable
2
- def ordered_by *beh, &blk
3
- raise ArgumentError, 'need exactly one of block and behavior' if !blk == beh.empty?
4
-
5
- beh = blk || (Symbol === beh.first ? sendmsg( *beh ) : beh.first )
2
+ def ordered_by beh
6
3
 
7
-
8
4
  sort do | a, b |
9
5
  a == b ? 0 : (
10
6
  beh.(a, b) ? -1 : 1
11
7
  )
12
8
  end
13
- end
14
9
 
15
- def to_stream; finite_stream self end
10
+ end
16
11
  end
17
-
@@ -1,7 +1,4 @@
1
1
  require 'forwarder'
2
-
3
- require_relative 'empty/enumerable'
4
-
5
2
  module Lab42
6
3
  class Stream
7
4
  class Empty < Stream
@@ -36,20 +33,17 @@ module Lab42
36
33
  def inject *args; args.first end
37
34
  alias_method :__inject__, :inject
38
35
 
39
- # TODO: Move this into lab42/core as Object#itself
40
- def itself *args, &blk; self end
36
+ def itself *; self end
41
37
 
42
- def scan initial, *args, &blk
38
+ def scan( initial, * )
43
39
  [initial]
44
40
  end
45
41
 
46
- def scan1 *args, &blk
42
+ def scan1( * )
47
43
  []
48
44
  end
49
45
 
50
46
 
51
- private
52
-
53
47
  def self.new
54
48
  @__instance__ ||= allocate
55
49
  end
@@ -1,4 +1,5 @@
1
1
  require_relative 'core/enumerable'
2
+ require_relative 'behavior'
2
3
 
3
4
  module Lab42
4
5
  class Stream
@@ -7,19 +8,17 @@ module Lab42
7
8
  module Enumerable
8
9
 
9
10
  def drop_until *bhv, &blk
10
- bhv = blk.make_behavior( *bhv )
11
- s = self
12
- loop do
13
- return s if bhv.(s.head)
14
- s = s.tail
15
- end
16
- empty_stream
11
+ bhv = Behavior.make( *bhv, &blk )
12
+ __drop_while__ bhv.not
17
13
  end
18
14
 
19
- # N.B. Not implemented as drop_until( bhv.not )
20
- # for performance reasons
21
15
  def drop_while *bhv, &blk
22
- bhv = blk.make_behavior( *bhv )
16
+ bhv = Behavior.make( *bhv, &blk )
17
+ __drop_while__ bhv
18
+ end
19
+
20
+
21
+ def __drop_while__ bhv
23
22
  s = self
24
23
  loop do
25
24
  return s unless bhv.(s.head)
@@ -31,6 +30,7 @@ module Lab42
31
30
  def each
32
31
  t = self
33
32
  loop do
33
+ return if t.empty?
34
34
  yield t.head
35
35
  t = t.tail
36
36
  end
@@ -64,7 +64,7 @@ module Lab42
64
64
  end
65
65
 
66
66
  def lazy_take n=1
67
- raise ArgumentError, "need a non negative Fixnum" if !(Fixnum === n) || n < 0
67
+ raise ArgumentError, "need a non negative Integer" if !(Integer === n) || n < 0
68
68
  __lazy_take__ n
69
69
  end
70
70
 
@@ -74,7 +74,7 @@ module Lab42
74
74
  end
75
75
 
76
76
  def lazy_take_until *bhv, &blk
77
- bhv = blk.make_behavior( *bhv )
77
+ bhv = Behavior.make( *bhv, &blk )
78
78
  __lazy_take_until__ bhv
79
79
  end
80
80
 
@@ -86,7 +86,7 @@ module Lab42
86
86
  end
87
87
 
88
88
  def lazy_take_while *bhv, &blk
89
- bhv = blk.make_behavior( *bhv )
89
+ bhv = Behavior.make( *bhv, &blk )
90
90
  __lazy_take_while__ bhv
91
91
  end
92
92
 
@@ -98,30 +98,30 @@ module Lab42
98
98
  end
99
99
 
100
100
  def reduce red=nil, &reducer
101
- red = reducer.make_behavior( red )
101
+ red = Behavior.make( red, &reducer)
102
102
  tail.__inject__ head, red
103
103
  end
104
104
 
105
105
  def inject agg, *red, &reducer
106
- __inject__ agg, reducer.make_behavior( *red )
106
+ __inject__ agg, Behavior.make( *red, &reducer )
107
107
  end
108
108
 
109
109
  def filter *args, &blk
110
- __filter__ self, blk.make_behavior( *args )
110
+ __filter__ self, Behavior.make( *args, &blk )
111
111
  end
112
112
 
113
113
  def reject *args, &blk
114
- __filter__ self, blk.make_behavior( *args ).not
114
+ __filter__ self, Behavior.make( *args, &blk ).not
115
115
  end
116
116
 
117
117
  def flatmap *args, &blk
118
- __flatmap__ blk.make_behavior( *args )
118
+ __flatmap__ Behavior.make( *args, &blk )
119
119
  end
120
120
 
121
121
  def __flatmap__ a_proc
122
- # require 'pry'
123
- # binding.pry
124
122
  hh = a_proc.( head )
123
+ raise ArgumentError, "flatmap can only map on streams, use flatmap_with_each to map over streams and enumerables" unless
124
+ Lab42::Stream === hh
125
125
  if hh.empty?
126
126
  tail.__flatmap__ a_proc
127
127
  else
@@ -130,18 +130,18 @@ module Lab42
130
130
  end
131
131
 
132
132
  def flatmap_with_each *args, &blk
133
- __flatmap_with_each__ blk.make_behavior( *args )
133
+ __flatmap_with_each__ Behavior.make( *args, &blk )
134
134
  end
135
135
 
136
136
  def __flatmap_with_each__ a_proc, rest_of_enum = []
137
137
  # Process expanded values
138
138
  return cons_stream( rest_of_enum.first ){ __flatmap_with_each__ a_proc, rest_of_enum.drop( 1 ) } unless
139
- rest_of_enum.empty?
139
+ rest_of_enum.empty?
140
140
 
141
141
  # Map a scalar value
142
142
  hh = a_proc.( head )
143
143
  return cons_stream( hh ){ tail.__flatmap_with_each__ a_proc } unless
144
- hh.respond_to? :each
144
+ hh.respond_to? :each
145
145
 
146
146
  # Start a new expansion...
147
147
  # ... consider an empty expansion
@@ -153,10 +153,8 @@ module Lab42
153
153
 
154
154
  def scan initial, *args, &blk
155
155
  cons_stream initial do
156
- __scan__ initial, blk.make_behavior( *args )
156
+ __scan__ initial, Behavior.make( *args, &blk )
157
157
  end.tap{ |r|
158
- # require 'pry'
159
- # binding.pry
160
158
  }
161
159
  end
162
160
 
@@ -170,16 +168,16 @@ module Lab42
170
168
  end
171
169
 
172
170
  def take_until *bhv, &blk
173
- bhv = blk.make_behavior( *bhv )
174
- x = []
175
- each do | ele |
176
- return x if bhv.( ele )
177
- x << ele
178
- end
179
- x
171
+ bhv = Behavior.make( *bhv, &blk )
172
+ __take_while__ bhv.not
180
173
  end
174
+
181
175
  def take_while *bhv, &blk
182
- bhv = blk.make_behavior( *bhv )
176
+ bhv = Behavior.make( *bhv, &blk )
177
+ __take_while__ bhv
178
+ end
179
+
180
+ def __take_while__ bhv
183
181
  x = []
184
182
  each do | ele |
185
183
  return x unless bhv.( ele )
@@ -189,8 +187,9 @@ module Lab42
189
187
  end
190
188
 
191
189
  def to_a
192
- take_while :true
190
+ take_while Behavior.const( true )
193
191
  end
192
+
194
193
  alias_method :entries, :to_a
195
194
 
196
195
  def make_cyclic
@@ -200,9 +199,8 @@ module Lab42
200
199
  end
201
200
 
202
201
  def map *args, &blk
203
- # TODO: Get this check and a factory to create a proc for this into core/fn
204
202
  raise ArgumentError, "use either a block or arguments" if args.empty? && !blk || !args.empty? && blk
205
- __map__ blk.make_behavior( *args )
203
+ __map__ Behavior.make( *args, &blk )
206
204
  end
207
205
 
208
206
  def __map__ prc
@@ -216,7 +214,7 @@ module Lab42
216
214
  end
217
215
 
218
216
  def take n=1
219
- raise ArgumentError, "need a non negative Fixnum" if !(Fixnum === n) || n < 0
217
+ raise ArgumentError, "need a non negative Integer" if !(Integer === n) || n < 0
220
218
  x = []
221
219
  each do | ele |
222
220
  return x if n.zero?
@@ -235,12 +233,12 @@ module Lab42
235
233
 
236
234
  def zip_as_ary *other_streamables
237
235
  zip( *other_streamables )
238
- .map( &:entries )
236
+ .map( &:entries )
239
237
  end
240
238
 
241
239
  def __zip__ streams
242
- cons_stream( [head] + streams.map(:head) ){
243
- tail.__zip__ streams.map(:tail)
240
+ cons_stream( [head] + streams.map(&:head) ){
241
+ tail.__zip__ streams.map(&:tail)
244
242
  }
245
243
  end
246
244
 
@@ -1,16 +1,14 @@
1
+ require_relative 'behavior'
1
2
  module Lab42
2
3
  class Stream
3
4
  module HigherOrder
4
5
  def combine *streams_and_op, &operation
5
6
  op = streams_and_op.pop unless self.class === streams_and_op.last
6
- op = operation.make_behavior op
7
- # TODO: Decide what to do if op.arity and streams_and_op.size.succ do not match????
7
+ op = Behavior.make1( op, &operation )
8
8
  __combine__( op, *streams_and_op )
9
9
  end
10
10
 
11
11
  def __combine__ op, *streams
12
- # TODO: Decide if we can continue if one of the streams is empty iff op.arity < 0
13
- # for now no!
14
12
  return empty_stream if streams.any?( &:empty? )
15
13
  values = streams.map( &:head )
16
14
  new_head = op.(head, *values)
@@ -23,7 +21,7 @@ module Lab42
23
21
  indexed = with_index
24
22
  n.times.map do | i |
25
23
  indexed
26
- .filter{ |e, idx| idx % n == i }
24
+ .filter{ |_, idx| idx % n == i }
27
25
  .map( :first )
28
26
  end
29
27
  end
@@ -1,4 +1,6 @@
1
1
  require 'lab42/core/kernel'
2
+ require_relative 'behavior'
3
+
2
4
  module Kernel
3
5
  def binop_streams op, stream1, stream2
4
6
  combine_streams stream1, stream2 do |e1, e2|
@@ -33,18 +35,27 @@ module Kernel
33
35
  end
34
36
 
35
37
  def finite_stream enum
36
- e = enum.lazy
37
- cons_stream( e.peek ){ finite_stream e.drop( 1 ) }
38
- rescue StopIteration
39
- empty_stream
38
+ case enum
39
+ when Range
40
+ _finite_stream_from_range enum
41
+ when Array
42
+ return empty_stream if enum.empty?
43
+ cons_stream(enum.first){ finite_stream(enum.drop(1)) }
44
+ when Hash
45
+ return empty_stream if enum.empty?
46
+ cons_stream(enum.first){ finite_stream(enum.without(enum.first.first)) }
47
+ when Enumerator
48
+ _finite_stream_from_enumerator! enum.to_enum
49
+ else
50
+ raise TypeError, "cannot create a finite stream from type #{enum.class.inspect}"
51
+ end
40
52
  end
41
53
 
54
+
42
55
  def flatmap stream, *args, &blk
43
56
  stream.flatmap( *args, &blk )
44
57
  end
45
58
 
46
- # TODO: Reimplement with a cursor into streams to avoid
47
- # the (potentially) costly array arithm in the tail def
48
59
  def merge_streams *streams
49
60
  s = streams.reject( &:empty? )
50
61
  return empty_stream if s.empty?
@@ -54,7 +65,7 @@ module Kernel
54
65
  end
55
66
 
56
67
  def merge_streams_by *streams_and_beh, &blk
57
- beh = blk || streams_and_beh.pop
68
+ beh = Lab42::Stream::Behavior.make1( blk || streams_and_beh.pop, &blk )
58
69
  __merge_streams_by__ beh, streams_and_beh
59
70
  end
60
71
 
@@ -69,27 +80,46 @@ module Kernel
69
80
 
70
81
  def iterate_without_block args
71
82
  rest = args.drop 1
72
- if Method === rest.first
83
+ if rest.first && rest.first.respond_to?( :call )
73
84
  cons_stream( args.first ){ iterate( rest.first.(*([args.first] + rest.drop(1))), *rest ) }
74
85
  else
75
- cons_stream( args.first ){ iterate( sendmsg(*rest).(args.first), *rest ) }
86
+ cons_stream( args.first ){ iterate( args.first.send(*rest), *rest ) }
76
87
  end
77
88
  end
78
89
 
79
- private
80
- def __merge_streams_by__ beh, streams
81
- still_there = streams.reject( &:empty? )
82
- return empty_stream if still_there.empty?
83
- __merge_streams_by_with_present__ beh, still_there, streams
84
- end
90
+ private
85
91
 
86
- def __merge_streams_by_with_present__ beh, still_there, streams
87
- ordered_heads = still_there
88
- .map( &:head )
89
- .ordered_by( beh )
92
+ def _finite_stream_from_boundaies fst, lst
93
+ return empty_stream if fst > lst
94
+ cons_stream(fst){ _finite_stream_from_boundaies fst.succ, lst }
95
+ end
90
96
 
91
- cons_stream_n( *ordered_heads ){
92
- __merge_streams_by__ beh, still_there.map( &:tail )
93
- }
94
- end
97
+ def _finite_stream_from_enumerator! enum
98
+ cons_stream( enum.next ){ _finite_stream_from_enumerator! enum }
99
+ rescue StopIteration
100
+ empty_stream
101
+ end
102
+
103
+ def _finite_stream_from_range range
104
+ fst = range.first
105
+ lst = range.last
106
+ lst = lst.pred if range.exclude_end?
107
+ _finite_stream_from_boundaies fst, lst
108
+ end
109
+
110
+ def __merge_streams_by__ beh, streams
111
+ still_there = streams.reject( &:empty? )
112
+ return empty_stream if still_there.empty?
113
+ __merge_streams_by_with_present__ beh, still_there
114
+ end
115
+
116
+ def __merge_streams_by_with_present__ beh, still_there
117
+ ordered_heads = still_there
118
+ .map( &:head )
119
+ .ordered_by( beh )
120
+
121
+ cons_stream_n( *ordered_heads ){
122
+ __merge_streams_by__ beh, still_there.map( &:tail )
123
+ }
124
+ end
95
125
  end
@@ -12,28 +12,9 @@ class Proc
12
12
  }
13
13
  end
14
14
 
15
- # TODO: Use this from core/fn as soon as available
16
- def make_behavior *args
17
- raise ArgumentError, "cannot specify behavior with block and args: #{args.inspect}" unless args.compact.empty?
18
- self
19
- end
20
-
21
15
  def not
22
16
  -> (*args, &blk) {
23
17
  ! self.(*args, &blk)
24
18
  }
25
19
  end
26
20
  end
27
-
28
- class NilClass
29
- # TODO: Use this from core/fn as soon as available
30
- def make_behavior *args
31
- return args.first if args.size == 1 && args.first.respond_to?( :call )
32
-
33
- return ->(*a){
34
- args.first(*(args.drop(1)+a))
35
- } if args.first.respond_to?( :call )
36
-
37
- sendmsg( *args )
38
- end
39
- end
@@ -3,7 +3,7 @@ module Lab42
3
3
  module Utility
4
4
 
5
5
  def segment *args, &blk
6
- __segment__ blk.make_behavior( *args )
6
+ __segment__ Behavior.make( *args, &blk )
7
7
  end
8
8
 
9
9
  def __segment__ beh
@@ -1,5 +1,5 @@
1
1
  module Lab42
2
2
  class Stream
3
- Version = "0.1.3"
3
+ Version = "0.2.0"
4
4
  end # class Stream
5
5
  end # module Lab42
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lab42_streams
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Dober
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-09 00:00:00.000000000 Z
11
+ date: 2017-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: forwarder2
@@ -30,56 +30,42 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.0'
33
+ version: '0.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.0'
40
+ version: '0.4'
41
41
  - !ruby/object:Gem::Dependency
42
- name: pry
42
+ name: pry-byebug
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.9'
47
+ version: 3.4.2
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.9'
55
- - !ruby/object:Gem::Dependency
56
- name: pry-nav
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '0.2'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '0.2'
54
+ version: 3.4.2
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: rspec
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '2.14'
61
+ version: '3.5'
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '2.14'
68
+ version: '3.5'
83
69
  - !ruby/object:Gem::Dependency
84
70
  name: qed
85
71
  requirement: !ruby/object:Gem::Requirement
@@ -109,19 +95,19 @@ dependencies:
109
95
  - !ruby/object:Gem::Version
110
96
  version: '1.8'
111
97
  - !ruby/object:Gem::Dependency
112
- name: byebug
98
+ name: simplecov
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
101
  - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '3.1'
103
+ version: '0.13'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
108
  - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '3.1'
110
+ version: '0.13'
125
111
  description: Lazy Evaluation, Streams, Enumerator#Lazy
126
112
  email: robert.dober@gmail.com
127
113
  executables: []
@@ -133,13 +119,12 @@ files:
133
119
  - lib/lab42/stream.rb
134
120
  - lib/lab42/stream/array.rb
135
121
  - lib/lab42/stream/auto_import.rb
122
+ - lib/lab42/stream/behavior.rb
136
123
  - lib/lab42/stream/class_methods.rb
137
124
  - lib/lab42/stream/core/enumerable.rb
138
125
  - lib/lab42/stream/delayed.rb
139
126
  - lib/lab42/stream/empty.rb
140
- - lib/lab42/stream/empty/enumerable.rb
141
127
  - lib/lab42/stream/enumerable.rb
142
- - lib/lab42/stream/hash.rb
143
128
  - lib/lab42/stream/higher_order.rb
144
129
  - lib/lab42/stream/kernel.rb
145
130
  - lib/lab42/stream/kernel/extensions.rb
@@ -158,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
158
143
  requirements:
159
144
  - - ">="
160
145
  - !ruby/object:Gem::Version
161
- version: 2.1.0
146
+ version: 2.4.0
162
147
  required_rubygems_version: !ruby/object:Gem::Requirement
163
148
  requirements:
164
149
  - - ">="
@@ -166,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
166
151
  version: '0'
167
152
  requirements: []
168
153
  rubyforge_project:
169
- rubygems_version: 2.4.6
154
+ rubygems_version: 2.6.8
170
155
  signing_key:
171
156
  specification_version: 4
172
157
  summary: Streams for Ruby 2.0
File without changes
@@ -1,10 +0,0 @@
1
- class Hash
2
- def to_stream
3
- values = to_a
4
- (0...values.size)
5
- .to_stream
6
- .map{ |i|
7
- Hash[*values[i]]
8
- }
9
- end
10
- end