lab42_streams 0.1.3 → 0.2.0
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 +4 -4
- data/README.md +1 -3
- data/lib/lab42/stream.rb +4 -6
- data/lib/lab42/stream/behavior.rb +62 -0
- data/lib/lab42/stream/class_methods.rb +1 -1
- data/lib/lab42/stream/core/enumerable.rb +2 -8
- data/lib/lab42/stream/empty.rb +3 -9
- data/lib/lab42/stream/enumerable.rb +39 -41
- data/lib/lab42/stream/higher_order.rb +3 -5
- data/lib/lab42/stream/kernel.rb +53 -23
- data/lib/lab42/stream/proc.rb +0 -19
- data/lib/lab42/stream/utility.rb +1 -1
- data/lib/lab42/stream/version.rb +1 -1
- metadata +15 -30
- data/lib/lab42/stream/empty/enumerable.rb +0 -0
- data/lib/lab42/stream/hash.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8d00b456b8ce625579e3dc38bf492d5f10f33c8
|
4
|
+
data.tar.gz: a454254eb45b9315675e2d64379186c9b3e7b71b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
data/lib/lab42/stream.rb
CHANGED
@@ -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__
|
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?(
|
54
|
+
return empty_stream if args.any?(&:empty?)
|
57
55
|
|
58
|
-
new_head = op.(head, *args.map(
|
59
|
-
cons_stream( new_head ){ tail.__combine_streams__(op, args.map(
|
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
|
@@ -1,17 +1,11 @@
|
|
1
1
|
module Enumerable
|
2
|
-
def ordered_by
|
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
|
-
|
10
|
+
end
|
16
11
|
end
|
17
|
-
|
data/lib/lab42/stream/empty.rb
CHANGED
@@ -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
|
-
|
40
|
-
def itself *args, &blk; self end
|
36
|
+
def itself *; self end
|
41
37
|
|
42
|
-
def scan initial, *
|
38
|
+
def scan( initial, * )
|
43
39
|
[initial]
|
44
40
|
end
|
45
41
|
|
46
|
-
def scan1 *
|
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 =
|
11
|
-
|
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 =
|
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
|
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 =
|
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 =
|
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 =
|
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,
|
106
|
+
__inject__ agg, Behavior.make( *red, &reducer )
|
107
107
|
end
|
108
108
|
|
109
109
|
def filter *args, &blk
|
110
|
-
__filter__ self,
|
110
|
+
__filter__ self, Behavior.make( *args, &blk )
|
111
111
|
end
|
112
112
|
|
113
113
|
def reject *args, &blk
|
114
|
-
__filter__ self,
|
114
|
+
__filter__ self, Behavior.make( *args, &blk ).not
|
115
115
|
end
|
116
116
|
|
117
117
|
def flatmap *args, &blk
|
118
|
-
__flatmap__
|
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__
|
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
|
-
|
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
|
-
|
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,
|
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 =
|
174
|
-
|
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 =
|
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
|
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__
|
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
|
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
|
-
|
236
|
+
.map( &:entries )
|
239
237
|
end
|
240
238
|
|
241
239
|
def __zip__ streams
|
242
|
-
cons_stream( [head] + streams.map(
|
243
|
-
tail.__zip__ streams.map(
|
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 =
|
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{ |
|
24
|
+
.filter{ |_, idx| idx % n == i }
|
27
25
|
.map( :first )
|
28
26
|
end
|
29
27
|
end
|
data/lib/lab42/stream/kernel.rb
CHANGED
@@ -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
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
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(
|
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
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
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
|
data/lib/lab42/stream/proc.rb
CHANGED
@@ -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
|
data/lib/lab42/stream/utility.rb
CHANGED
data/lib/lab42/stream/version.rb
CHANGED
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.
|
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:
|
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.
|
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.
|
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:
|
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:
|
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: '
|
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: '
|
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:
|
98
|
+
name: simplecov
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
114
100
|
requirements:
|
115
101
|
- - "~>"
|
116
102
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
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: '
|
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.
|
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.
|
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
|