reducers 0.0.5

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.
@@ -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: []