reducers 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9e4ce6f19825a68ed2f7fe8789f4664ad5e53162
4
+ data.tar.gz: 58ca8955c2d87b32de33fb068654c2caddd48193
5
+ SHA512:
6
+ metadata.gz: cf8a8a0f43172d79c381ed2fe051222235ea910104b93a334b0ac5233a724164d30a82f442faa6fa9470ba0b99fd632dd7a8a1bdd3833e28ac2a1be89f11fda7
7
+ data.tar.gz: 849e17e58a0cc129a20ada47ece1a5a95e2a7e7e2caab69a2ea63419e9afb8103688e6e15bb4e831a952644bc42fab92eb4b3e765fda3e339c65cfbd933b041e
@@ -0,0 +1 @@
1
+ require "autotest/bundler"
File without changes
data/.rspec ADDED
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,6 @@
1
+ === 1.0.0 / 2012-12-24
2
+
3
+ * 1 major enhancement
4
+
5
+ * Birthday!
6
+
@@ -0,0 +1,11 @@
1
+ .autotest
2
+ .rspec
3
+ History.txt
4
+ Manifest.txt
5
+ README.txt
6
+ Rakefile
7
+ bin/reducers
8
+ lib/reducers.rb
9
+ lib/reducers/functional.rb
10
+ spec/reducers_spec.rb
11
+ spec/spec_helper.rb
@@ -0,0 +1,59 @@
1
+ = reducers
2
+
3
+ == https://github.com/dsisnero/reducers
4
+
5
+
6
+
7
+ == DESCRIPTION:
8
+
9
+ This library is intended to provide a reducer library on collections for ruby like the clojure reducers
10
+
11
+ == FEATURES/PROBLEMS:
12
+
13
+ *
14
+
15
+ == SYNOPSIS:
16
+
17
+
18
+
19
+ == REQUIREMENTS:
20
+
21
+
22
+
23
+ == INSTALL:
24
+
25
+ sudo gem install reducers
26
+
27
+ == DEVELOPERS:
28
+
29
+ After checking out the source, run:
30
+
31
+ $ rake newb
32
+
33
+ This task will install any missing dependencies, run the tests/specs,
34
+ and generate the RDoc.
35
+
36
+ == LICENSE:
37
+
38
+ (The MIT License)
39
+
40
+ Copyright (c) 2012 FIX
41
+
42
+ Permission is hereby granted, free of charge, to any person obtaining
43
+ a copy of this software and associated documentation files (the
44
+ 'Software'), to deal in the Software without restriction, including
45
+ without limitation the rights to use, copy, modify, merge, publish,
46
+ distribute, sublicense, and/or sell copies of the Software, and to
47
+ permit persons to whom the Software is furnished to do so, subject to
48
+ the following conditions:
49
+
50
+ The above copyright notice and this permission notice shall be
51
+ included in all copies or substantial portions of the Software.
52
+
53
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
54
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
56
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
57
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
58
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
59
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+
6
+ Hoe.plugin :bundler
7
+
8
+ # Hoe.plugin :compiler
9
+ # Hoe.plugin :compiler
10
+ # Hoe.plugin :gem_prelude_sucks
11
+ # Hoe.plugin :gem_prelude_sucks
12
+ # Hoe.plugin :inline
13
+ # Hoe.plugin :inline
14
+ # Hoe.plugin :racc
15
+ # Hoe.plugin :racc
16
+ # Hoe.plugin :rcov
17
+ # Hoe.plugin :rcov
18
+ # Hoe.plugin :rubyforge
19
+ # Hoe.plugin :rubyforge
20
+
21
+ Hoe.spec 'reducers' do
22
+
23
+ developer('Dominic Sisneros', 'dsisnero@gmail.com')
24
+ # extra_deps << ['blah', '~> 1.0']
25
+ # extra_dev_deps << ['blah', '~>1.0']
26
+ # dependency(name,version,type) :type one of :[:runtime, :dev,
27
+ # :development, :developer]
28
+ dependency('hoe-bundler', '> 0.0.0', :dev)
29
+ dependency('rspec', '> 0.0.0', :dev)
30
+ dependency('ZenTest', '> 0.0.0', :dev)
31
+ dependency('cucumber', '> 0.0.0', :dev)
32
+ dependency('aruba', '> 0.0.0', :dev)
33
+ dependency('lazing', '>0.0.0', :dev)
34
+
35
+ ##
36
+ # Optional: Extra files you want to add to RDoc.
37
+ #
38
+ # .txt files are automatically included (excluding the obvious).
39
+
40
+ # extra_rdoc_files
41
+
42
+ ##
43
+ # Optional: The filename for the project history. [default: History.txt]
44
+
45
+ # history_file
46
+
47
+
48
+ # self.rubyforge_name = 'reducers' # if different than 'reducers'
49
+ end
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ abort "you need to write me"
@@ -0,0 +1,330 @@
1
+ require_relative 'reducers/functional'
2
+
3
+ module Enumerable
4
+
5
+ def lazy2(&block)
6
+ Reducers::Reducible.new(self)
7
+ end
8
+
9
+ end
10
+
11
+
12
+ module Reducers
13
+
14
+ VERSION = '0.0.5'
15
+
16
+ module Transformers
17
+
18
+ def map(&block)
19
+ add_proc mapping(&block)
20
+ self
21
+ end
22
+
23
+ def mash
24
+ reduce({}) do |result, input|
25
+
26
+ r = yield input
27
+
28
+ case r
29
+ when Hash
30
+ nk, nv = *r.to_a[0]
31
+ when Range
32
+ nk, nv = r.first, r.last
33
+ else
34
+ nk, nv = *r
35
+ end
36
+ result[nk] = nv
37
+ result
38
+ end
39
+ end
40
+
41
+ def duplicate_on(&block)
42
+ group_by(&block).map{|x| x[1]}.select{|x| x.size > 1}
43
+ end
44
+
45
+ def group_by()
46
+ groups = reduce({}) do |h,i|
47
+ result = yield i
48
+ if h[result]
49
+ h[result] << i
50
+ else
51
+ h[result] = [i]
52
+ end
53
+ h
54
+ end
55
+ groups.lazy2
56
+ end
57
+
58
+ def grep(patt)
59
+ select{|x| x =~ patt}
60
+ end
61
+
62
+ def select(&block)
63
+ add_proc filtering(&block)
64
+ self
65
+ end
66
+
67
+ def reject(&block)
68
+ add_proc filtering(&(block.complement))
69
+ self
70
+ end
71
+
72
+ def mapcat(&block)
73
+ add_proc mapcatting(&block)
74
+ self
75
+ end
76
+
77
+ def take(n)
78
+ add_proc taking(n)
79
+ self
80
+ end
81
+
82
+ def drop(n)
83
+ add_proc dropping(n)
84
+ self
85
+ end
86
+
87
+ def take_while(&block)
88
+ add_proc take_while_proc(&block)
89
+ self
90
+ end
91
+
92
+ def drop_while(&block)
93
+ add_proc drop_while_proc(&block)
94
+ self
95
+ end
96
+
97
+ def flat_map(&block)
98
+ map(&block).flatten
99
+ self
100
+ end
101
+
102
+
103
+ def to_a
104
+ force
105
+ end
106
+
107
+ protected
108
+
109
+ def add_proc(proc)
110
+ # @chain = chain.compose(proc)
111
+ @proc_chain << proc
112
+ end
113
+
114
+ def mapping()
115
+ ->(f1){
116
+ ->(result,input){
117
+ mv = yield input
118
+ f1[result,mv ]
119
+
120
+ }
121
+
122
+ }
123
+ end
124
+
125
+ def mashing
126
+ ->(f1){
127
+
128
+ ->(result,input){
129
+ r = yield input
130
+ h = {}
131
+ case r
132
+ when Hash
133
+ nk, nv = *r.to_a[0]
134
+ when Range
135
+ nk, nv = r.first, r.last
136
+ else
137
+ nk, nv = *r
138
+ end
139
+ h[nk] = nv
140
+ f1[result,h]
141
+ }
142
+ }
143
+ end
144
+
145
+
146
+ def taking(n)
147
+ ->(f1){
148
+ ->(result, input){
149
+ n = n - 1
150
+ if n >= 0
151
+ f1[result, input]
152
+ else
153
+ throw(:reduced, result)
154
+ end
155
+ }
156
+ }
157
+ end
158
+
159
+ def dropping(n)
160
+ ->(f1){
161
+ ->(result,input){
162
+ n = n -1
163
+ if n < 0
164
+ f1[result,input]
165
+ else
166
+ result
167
+ end
168
+ }
169
+ }
170
+ end
171
+
172
+ def take_while_proc()
173
+ ->(f1){
174
+ taking = true
175
+ ->(result,input){
176
+ taking = yield input
177
+ if taking
178
+ f1[result,input]
179
+ else
180
+ throw(:reduced,result)
181
+ end
182
+ }
183
+ }
184
+ end
185
+
186
+
187
+ def drop_while_proc()
188
+ ->(f1){
189
+ dropping = true
190
+ ->(result, input){
191
+
192
+ if dropping
193
+ dropping = yield input
194
+ end
195
+ if dropping
196
+ result
197
+ else
198
+ f1[result,input]
199
+ end
200
+ }
201
+ }
202
+ end
203
+
204
+ def filtering()
205
+ ->(f1){
206
+ ->(result,input){
207
+ if yield input
208
+ f1[ result,input]
209
+ else
210
+ result
211
+ end
212
+ }
213
+ }
214
+ end
215
+
216
+ def parting()
217
+ ->(f1){
218
+ ->(result,input){
219
+ if yield input
220
+ [f1[result,input],result]
221
+ else
222
+ [result, f1[result,input]]
223
+ end
224
+ }}
225
+ end
226
+
227
+
228
+ def mapcatting()
229
+ ->(f1){
230
+ ->(result,input){
231
+ mcv = yield input
232
+ reduce[f1, result, mcv]
233
+ }
234
+ }
235
+ end
236
+
237
+ def flatmapping()
238
+ ->(f1){
239
+ ->(result,input){
240
+ mcv = yield input
241
+ f1[result, mcv.flatten]
242
+ }
243
+ }
244
+ end
245
+
246
+ end
247
+
248
+
249
+ class Undefined; end
250
+
251
+ class Reducible
252
+
253
+ include Transformers
254
+
255
+
256
+ # attr_reader :chain
257
+ attr_reader :coll, :proc_chain
258
+
259
+ def initialize(coll)
260
+ @coll = coll
261
+ @chain = ->x{x}
262
+ @proc_chain = []
263
+ end
264
+
265
+ def reduce(init = nil, f= Undefined ,&block)
266
+ if !block or !f == Undefined
267
+ if f == Undefined
268
+ f = init
269
+ init = nil
270
+ end
271
+
272
+ reducer = f
273
+ else
274
+ reducer = chain.(block) if f == Undefined
275
+ end
276
+
277
+ result = catch(:reduced){
278
+
279
+ if init
280
+ coll.reduce(init,&reducer)
281
+ else
282
+ coll.reduce(&reducer)
283
+ end
284
+ }
285
+
286
+ end
287
+
288
+ def initialize_copy(source)
289
+ super
290
+ @proc_chain = @proc_chain.dup
291
+ end
292
+
293
+ def tee
294
+ p2 = self.dup
295
+ [self, p2]
296
+ end
297
+
298
+ def partition(&block)
299
+ p1,p2 = tee
300
+ [p1.select(&block), p2.reject(&block)]
301
+ end
302
+
303
+ def chain
304
+ chain ||= Proc.compose(proc_chain)
305
+ end
306
+
307
+
308
+ def force
309
+ reduce([]){|r,i| r << i ; r}
310
+ end
311
+
312
+
313
+ end
314
+ end
315
+
316
+
317
+ # (defn reducer
318
+ # ([coll xf]
319
+ # (reify
320
+ # clojure.core.protocols/CollReduce
321
+ # (coll-reduce [_ f1 init]
322
+ # (clojure.core.protocols/coll-reduce coll (xf f1) init)))))
323
+
324
+ # def reducer(coll,xf)
325
+ # Class.new do
326
+ # define_method :reduce do |init,coll,f1|
327
+ # coll.reduce(init,xf.(f1))
328
+ # end
329
+ # end
330
+ # end
@@ -0,0 +1,42 @@
1
+ module Functional
2
+
3
+ def identity
4
+ ->x{ x}
5
+ end
6
+
7
+
8
+ module ClassMethods
9
+
10
+ def compose(*proc_chain)
11
+ proc_chain = proc_chain.first if proc_chain.first.class == Array
12
+ proc_chain.reduce(->(x){x}){|result,p| result.compose(p)}
13
+ end
14
+ end
15
+
16
+
17
+
18
+
19
+ def complement
20
+ lambda {|*args| not self.call(*args) }
21
+ end
22
+
23
+ def compose(other)
24
+ lambda {|*args| call(other.call(*args)) }
25
+ end
26
+
27
+ def pipe(other)
28
+ other.compose(self)
29
+ end
30
+
31
+
32
+ alias :* :compose
33
+ alias :>> :pipe
34
+
35
+
36
+
37
+
38
+
39
+ end
40
+
41
+ class Proc; include Functional; extend Functional::ClassMethods; end
42
+ class Method; include Functional; extend Functional::ClassMethods; end
@@ -0,0 +1,9 @@
1
+ require_relative 'spec_helper'
2
+
3
+ require "reducers"
4
+
5
+ describe Reducers do
6
+ it "can be created" do
7
+ Reducers.new.must_be_instance_of Reducers
8
+ end
9
+ end
@@ -0,0 +1,17 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper.rb"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+ require 'rspec'
8
+ require 'reducers'
9
+
10
+
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+ end
16
+
17
+
metadata ADDED
@@ -0,0 +1,175 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: reducers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Dominic Sisneros
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-02-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hoe-bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>'
32
+ - !ruby/object:Gem::Version
33
+ version: 0.0.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>'
39
+ - !ruby/object:Gem::Version
40
+ version: 0.0.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>'
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.0
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>'
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: ZenTest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>'
60
+ - !ruby/object:Gem::Version
61
+ version: 0.0.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>'
67
+ - !ruby/object:Gem::Version
68
+ version: 0.0.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: cucumber
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>'
74
+ - !ruby/object:Gem::Version
75
+ version: 0.0.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>'
81
+ - !ruby/object:Gem::Version
82
+ version: 0.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: aruba
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>'
88
+ - !ruby/object:Gem::Version
89
+ version: 0.0.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>'
95
+ - !ruby/object:Gem::Version
96
+ version: 0.0.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: lazing
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>'
102
+ - !ruby/object:Gem::Version
103
+ version: 0.0.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>'
109
+ - !ruby/object:Gem::Version
110
+ version: 0.0.0
111
+ - !ruby/object:Gem::Dependency
112
+ name: hoe
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ~>
116
+ - !ruby/object:Gem::Version
117
+ version: '3.5'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ~>
123
+ - !ruby/object:Gem::Version
124
+ version: '3.5'
125
+ description: This library is intended to provide a reducer library on collections
126
+ for ruby like the clojure reducers
127
+ email:
128
+ - dsisnero@gmail.com
129
+ executables:
130
+ - reducers
131
+ extensions: []
132
+ extra_rdoc_files:
133
+ - History.txt
134
+ - Manifest.txt
135
+ - README.txt
136
+ files:
137
+ - .autotest
138
+ - .rspec
139
+ - History.txt
140
+ - Manifest.txt
141
+ - README.txt
142
+ - Rakefile
143
+ - bin/reducers
144
+ - lib/reducers.rb
145
+ - lib/reducers/functional.rb
146
+ - spec/reducers_spec.rb
147
+ - spec/spec_helper.rb
148
+ - .gemtest
149
+ homepage:
150
+ licenses: []
151
+ metadata: {}
152
+ post_install_message:
153
+ rdoc_options:
154
+ - --main
155
+ - README.txt
156
+ require_paths:
157
+ - lib
158
+ required_ruby_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - '>='
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ required_rubygems_version: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - '>='
166
+ - !ruby/object:Gem::Version
167
+ version: '0'
168
+ requirements: []
169
+ rubyforge_project: reducers
170
+ rubygems_version: 2.0.0
171
+ signing_key:
172
+ specification_version: 4
173
+ summary: This library is intended to provide a reducer library on collections for
174
+ ruby like the clojure reducers
175
+ test_files: []