scaruby 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/scaruby/seq.rb CHANGED
@@ -1,395 +1,395 @@
1
- # -*- encoding: utf-8 -*-
2
-
3
- module Scaruby
4
- class Seq
5
- include Enumerable
6
-
7
- attr :array
8
-
9
- def each(&block)
10
- @array.each do |e|
11
- yield e
12
- end
13
- nil
14
- end
15
-
16
- def self.apply(enumerable)
17
- Seq.new(enumerable)
18
- end
19
-
20
- def initialize(enumerable)
21
- assert_type(enumerable, Enumerable)
22
- @array = enumerable.to_a
23
- end
24
-
25
- def to_a
26
- @array
27
- end
28
-
29
- def corresponds(that, &predicate)
30
- @array.zip(that).inject(true) {|still_matched,e|
31
- if ! still_matched then
32
- false
33
- elsif yield e[0], e[1] then
34
- true
35
- else
36
- false
37
- end
38
- }
39
- end
40
-
41
- def count(&predicate)
42
- @array.count(&predicate)
43
- end
44
-
45
- def diff(that)
46
- filter {|e| ! that.include?(e) }
47
- end
48
-
49
- def distinct
50
- Seq.new(@array.uniq)
51
- end
52
-
53
- def drop(n)
54
- Seq.new(@array.drop(n))
55
- end
56
-
57
- def drop_right(n)
58
- Seq.new(@array.reverse.drop(n).reverse)
59
- end
60
-
61
- def drop_while(&predicate)
62
- Seq.new(@array.inject([false,[]]) {|passed,x|
63
- no_need_to_yield, result = passed[0], passed[1]
64
- if no_need_to_yield then
65
- [true, result.push(x)]
66
- elsif yield x then
67
- passed
68
- else
69
- [true, result.push(x)]
70
- end
71
- }[1])
72
- end
73
-
74
- def ends_with(that)
75
- if that.nil? || that.length > @array.length then
76
- return false
77
- end
78
- this_end = @array.reverse.take(that.length).reverse
79
- this_end.zip(that).inject(true) {|all_matched,a|
80
- if ! all_matched then
81
- false
82
- elsif a.length != 2 then
83
- false
84
- else
85
- a[0] == a[1]
86
- end
87
- }
88
- end
89
-
90
- def exists(&predicate)
91
- @array.any?(&predicate)
92
- end
93
-
94
- def filter(&predicate)
95
- Seq.new(@array.select {|e| yield e })
96
- end
97
-
98
- def filter_not(&predicate)
99
- Seq.new(@array.select {|e| ! yield e })
100
- end
101
-
102
- def find(&predicate)
103
- Option.new(@array.find(&predicate))
104
- end
105
-
106
- def flat_map(&block)
107
- Seq.new(@array.inject([]) {|z,x|
108
- applied = yield x
109
- if applied.is_a?(Enumerable) then
110
- applied.inject(z) {|z,elm| z.push(elm) }
111
- elsif applied.is_a?(Seq) then
112
- applied.to_a.inject(z) {|z,elm| z.push(elm) }
113
- elsif applied.is_a?(Option) then
114
- applied.is_defined ? z.push(applied.get) : z
115
- else
116
- z.push(applied)
117
- end
118
- })
119
- end
120
-
121
- def flatten
122
- Seq.new(@array.inject([]) {|z,x|
123
- if x.is_a?(Enumerable) then
124
- x.inject(z) {|z,elm| z.push(elm) }
125
- elsif x.is_a?(Option) then
126
- x.is_defined ? z.push(x.get) : z
127
- else
128
- z.push(x)
129
- end
130
- })
131
- end
132
-
133
- def fold_left(z, &block)
134
- @array.inject(z) {|z,x| yield z, x }
135
- end
136
-
137
- def fold_right(z, &block)
138
- @array.reverse.inject(z) {|z,x| yield z, x }
139
- end
140
-
141
- def forall(&predicate)
142
- @array.all?(&predicate)
143
- end
144
-
145
- def foreach(&block)
146
- @array.each do |e|
147
- yield e
148
- end
149
- nil
150
- end
151
-
152
- def group_by(&block)
153
- Map.new(@array.inject({}) {|z,e|
154
- if z[e].nil? then
155
- z[e] = [e]
156
- else
157
- z[e] = z[e].push(e)
158
- end
159
- z
160
- })
161
- end
162
-
163
- def head
164
- @array.first
165
- end
166
-
167
- def head_option
168
- Option.new(@array.first)
169
- end
170
-
171
- def indices
172
- Seq.new(0.upto(@array.length-1))
173
- end
174
-
175
- def init
176
- Seq.new(@array.take(@array.length - 1))
177
- end
178
-
179
- def intersect(that)
180
- Seq.new(@array.inject([]) {|z,x|
181
- that.include?(x) ? z.push(x) : z
182
- })
183
- end
184
-
185
- def is_empty
186
- @array.nil? || @array.empty?
187
- end
188
-
189
- def last
190
- @array.last
191
- end
192
-
193
- def last_option
194
- Option.new(@array.last)
195
- end
196
-
197
- def length
198
- @array.length
199
- end
200
-
201
- def lift
202
- AppliableProc.new {|i| Option.new(@array[i]) }
203
- end
204
-
205
- def map(&block)
206
- #Seq.new(@array.collect {|e| yield e })
207
- Seq.new(@array.map {|e| yield e })
208
- end
209
-
210
- def max
211
- @array.max
212
- end
213
-
214
- def min
215
- @array.min
216
- end
217
-
218
- def mk_string(*args)
219
- case args.length
220
- when 0
221
- start_part, sep, end_part = '', '', ''
222
- when 1
223
- start_part, sep, end_part = '', args[0], ''
224
- when 2
225
- raise ArgumentError, 'Illegal number of arguments (' + args.length.to_s + ')'
226
- else
227
- start_part, sep, end_part = args[0], args[1], args[2]
228
- end
229
- start_part + @array.join(sep) + end_part
230
- end
231
-
232
- def non_empty
233
- ! is_empty
234
- end
235
-
236
- def partition(&predicate)
237
- Seq.new(@array.chunk(&predicate).inject([[],[]]) {|z, matched_and_elm|
238
- matched, elm = matched_and_elm[0], matched_and_elm[1].first
239
- if matched then
240
- [z[0].push(elm), z[1]]
241
- else
242
- [z[0],z[1].push(elm)]
243
- end
244
- })
245
- end
246
-
247
- def patch(from, patch, replaced)
248
- #Seq.new(@array.take(from).concat(patch).concat(@array.drop(from).drop(replaced)))
249
- Seq.new(@array.take(from) + patch + @array.drop(from).drop(replaced))
250
- end
251
-
252
- def reverse
253
- Seq.new(@array.reverse)
254
- end
255
-
256
- def reverse_map(&block)
257
- #Seq.new(@array.reverse.collect {|e| yield e })
258
- Seq.new(@array.reverse.map {|e| yield e })
259
- end
260
-
261
- def same_elements(that)
262
- @array.zip(that).inject(true) {|still_same,a|
263
- if ! still_same then
264
- false
265
- elsif a.length != 2 then
266
- false
267
- else
268
- a[0] == a[1]
269
- end
270
- }
271
- end
272
-
273
- def scan_left(n, &block)
274
- Seq.new(@array.inject([n,[n]]) {|last_and_array,x|
275
- last, array = last_and_array[0], last_and_array[1]
276
- applied = yield last, x
277
- [applied, array.push(applied)]
278
- }[1])
279
- end
280
-
281
- def scan_right(n, &block)
282
- Seq.new(@array.reverse.inject([n,[n]]) {|last_and_array,x|
283
- last, array = last_and_array[0], last_and_array[1]
284
- applied = yield last, x
285
- [applied, array.push(applied)]
286
- }[1].reverse)
287
- end
288
-
289
- def size
290
- @array.length
291
- end
292
-
293
- def slice(from, until_n)
294
- Seq.new(@array.drop(from).take(until_n - from))
295
- end
296
-
297
- def sliding(len)
298
- result = []
299
- @array.each_with_index do |e,idx|
300
- if idx < (@array.length - len + 1) then
301
- result.push(@array.slice(idx, len))
302
- end
303
- end
304
- Seq.new(result)
305
- end
306
-
307
- def sort_with(&predicate)
308
- @array.sort(&predicate)
309
- end
310
-
311
- def span(&predicate)
312
- result = @array.inject([true,[],[]]) {|z,x|
313
- still_matched, first, second = z[0], z[1], z[2]
314
- if ! still_matched then
315
- [false,first,second.push(x)]
316
- elsif yield x then
317
- [true,first.push(x),second]
318
- else
319
- [false,first,second.push(x)]
320
- end
321
- }
322
- Seq.new([result[1],result[2]])
323
- end
324
-
325
- def split_at(n)
326
- Seq.new([@array.take(n),@array.drop(n)])
327
- end
328
-
329
- def starts_with(that)
330
- if that.nil? || that.length > @array.length then
331
- return false
332
- end
333
- this_start = @array.take(that.length)
334
- this_start.zip(that).inject(true) {|all_matched,a|
335
- if ! all_matched then
336
- false
337
- elsif a.length != 2 then
338
- false
339
- else
340
- a[0] == a[1]
341
- end
342
- }
343
- end
344
-
345
- def sum
346
- @array.inject(0) {|z,x| z + x }
347
- end
348
-
349
- def tail
350
- Seq.new(@array.drop(1))
351
- end
352
-
353
- def take(n)
354
- Seq.new(@array.take(n))
355
- end
356
-
357
- def take_right(n)
358
- Seq.new(@array.reverse.take(n).reverse)
359
- end
360
-
361
- def take_while(&predicate)
362
- Seq.new(@array.inject([false,[]]) {|passed,x|
363
- is_already_unmatched, result = passed[0], passed[1]
364
- if is_already_unmatched then
365
- passed
366
- elsif yield x then
367
- [false,result.push(x)]
368
- else
369
- [true, result]
370
- end
371
- }[1])
372
- end
373
-
374
- def union(that)
375
- Seq.new(@array.concat(that))
376
- end
377
-
378
- def updated(idx, elm)
379
- Seq.new(@array.fill(elm,idx,1))
380
- end
381
-
382
- def zip(that)
383
- Seq.new(@array.zip(that).select {|a,b| ! a.nil? && ! b.nil? })
384
- end
385
-
386
- def zip_with_index
387
- with_index = []
388
- @array.each_with_index do |v,idx|
389
- with_index.push([v,idx])
390
- end
391
- with_index
392
- end
393
-
394
- end
395
- end
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Scaruby
4
+ class Seq
5
+ include Enumerable
6
+
7
+ attr :array
8
+
9
+ def each(&block)
10
+ @array.each do |e|
11
+ yield e
12
+ end
13
+ nil
14
+ end
15
+
16
+ def self.apply(enumerable)
17
+ Seq.new(enumerable)
18
+ end
19
+
20
+ def initialize(enumerable)
21
+ assert_type(enumerable, Enumerable)
22
+ @array = enumerable.to_a
23
+ end
24
+
25
+ def to_a
26
+ @array
27
+ end
28
+
29
+ def corresponds(that, &predicate)
30
+ @array.zip(that).inject(true) { |still_matched, e|
31
+ if !still_matched
32
+ false
33
+ elsif yield e[0], e[1]
34
+ true
35
+ else
36
+ false
37
+ end
38
+ }
39
+ end
40
+
41
+ def count(&predicate)
42
+ @array.count(&predicate)
43
+ end
44
+
45
+ def diff(that)
46
+ filter { |e| !that.include?(e) }
47
+ end
48
+
49
+ def distinct
50
+ Seq.new(@array.uniq)
51
+ end
52
+
53
+ def drop(n)
54
+ Seq.new(@array.drop(n))
55
+ end
56
+
57
+ def drop_right(n)
58
+ Seq.new(@array.reverse.drop(n).reverse)
59
+ end
60
+
61
+ def drop_while(&predicate)
62
+ Seq.new(@array.inject([false, []]) { |passed, x|
63
+ no_need_to_yield, result = passed[0], passed[1]
64
+ if no_need_to_yield
65
+ [true, result.push(x)]
66
+ elsif yield x
67
+ passed
68
+ else
69
+ [true, result.push(x)]
70
+ end
71
+ }[1])
72
+ end
73
+
74
+ def ends_with(that)
75
+ if that.nil? || that.length > @array.length
76
+ return false
77
+ end
78
+ this_end = @array.reverse.take(that.length).reverse
79
+ this_end.zip(that).inject(true) { |all_matched, a|
80
+ if !all_matched
81
+ false
82
+ elsif a.length != 2
83
+ false
84
+ else
85
+ a[0] == a[1]
86
+ end
87
+ }
88
+ end
89
+
90
+ def exists(&predicate)
91
+ @array.any?(&predicate)
92
+ end
93
+
94
+ def filter(&predicate)
95
+ Seq.new(@array.select { |e| yield e })
96
+ end
97
+
98
+ def filter_not(&predicate)
99
+ Seq.new(@array.select { |e| !yield e })
100
+ end
101
+
102
+ def find(&predicate)
103
+ Option.new(@array.find(&predicate))
104
+ end
105
+
106
+ def flat_map(&block)
107
+ Seq.new(@array.inject([]) { |z, x|
108
+ applied = yield x
109
+ if applied.is_a?(Enumerable)
110
+ applied.inject(z) { |z, elm| z.push(elm) }
111
+ elsif applied.is_a?(Seq)
112
+ applied.to_a.inject(z) { |z, elm| z.push(elm) }
113
+ elsif applied.is_a?(Option)
114
+ applied.is_defined ? z.push(applied.get) : z
115
+ else
116
+ z.push(applied)
117
+ end
118
+ })
119
+ end
120
+
121
+ def flatten
122
+ Seq.new(@array.inject([]) { |z, x|
123
+ if x.is_a?(Enumerable)
124
+ x.inject(z) { |z, elm| z.push(elm) }
125
+ elsif x.is_a?(Option)
126
+ x.is_defined ? z.push(x.get) : z
127
+ else
128
+ z.push(x)
129
+ end
130
+ })
131
+ end
132
+
133
+ def fold_left(z, &block)
134
+ @array.inject(z) { |z, x| yield z, x }
135
+ end
136
+
137
+ def fold_right(z, &block)
138
+ @array.reverse.inject(z) { |z, x| yield z, x }
139
+ end
140
+
141
+ def forall(&predicate)
142
+ @array.all?(&predicate)
143
+ end
144
+
145
+ def foreach(&block)
146
+ @array.each do |e|
147
+ yield e
148
+ end
149
+ nil
150
+ end
151
+
152
+ def group_by(&block)
153
+ Map.new(@array.inject({}) { |z, e|
154
+ if z[e].nil?
155
+ z[e] = [e]
156
+ else
157
+ z[e] = z[e].push(e)
158
+ end
159
+ z
160
+ })
161
+ end
162
+
163
+ def head
164
+ @array.first
165
+ end
166
+
167
+ def head_option
168
+ Option.new(@array.first)
169
+ end
170
+
171
+ def indices
172
+ Seq.new(0.upto(@array.length-1))
173
+ end
174
+
175
+ def init
176
+ Seq.new(@array.take(@array.length - 1))
177
+ end
178
+
179
+ def intersect(that)
180
+ Seq.new(@array.inject([]) { |z, x|
181
+ that.include?(x) ? z.push(x) : z
182
+ })
183
+ end
184
+
185
+ def is_empty
186
+ @array.nil? || @array.empty?
187
+ end
188
+
189
+ def last
190
+ @array.last
191
+ end
192
+
193
+ def last_option
194
+ Option.new(@array.last)
195
+ end
196
+
197
+ def length
198
+ @array.length
199
+ end
200
+
201
+ def lift
202
+ AppliableProc.new { |i| Option.new(@array[i]) }
203
+ end
204
+
205
+ def map(&block)
206
+ #Seq.new(@array.collect {|e| yield e })
207
+ Seq.new(@array.map { |e| yield e })
208
+ end
209
+
210
+ def max
211
+ @array.max
212
+ end
213
+
214
+ def min
215
+ @array.min
216
+ end
217
+
218
+ def mk_string(*args)
219
+ case args.length
220
+ when 0
221
+ start_part, sep, end_part = '', '', ''
222
+ when 1
223
+ start_part, sep, end_part = '', args[0], ''
224
+ when 2
225
+ raise ArgumentError, 'Illegal number of arguments (' + args.length.to_s + ')'
226
+ else
227
+ start_part, sep, end_part = args[0], args[1], args[2]
228
+ end
229
+ start_part + @array.join(sep) + end_part
230
+ end
231
+
232
+ def non_empty
233
+ !is_empty
234
+ end
235
+
236
+ def partition(&predicate)
237
+ Seq.new(@array.chunk(&predicate).inject([[], []]) { |z, matched_and_elm|
238
+ matched, elm = matched_and_elm[0], matched_and_elm[1].first
239
+ if matched
240
+ [z[0].push(elm), z[1]]
241
+ else
242
+ [z[0], z[1].push(elm)]
243
+ end
244
+ })
245
+ end
246
+
247
+ def patch(from, patch, replaced)
248
+ #Seq.new(@array.take(from).concat(patch).concat(@array.drop(from).drop(replaced)))
249
+ Seq.new(@array.take(from) + patch + @array.drop(from).drop(replaced))
250
+ end
251
+
252
+ def reverse
253
+ Seq.new(@array.reverse)
254
+ end
255
+
256
+ def reverse_map(&block)
257
+ #Seq.new(@array.reverse.collect {|e| yield e })
258
+ Seq.new(@array.reverse.map { |e| yield e })
259
+ end
260
+
261
+ def same_elements(that)
262
+ @array.zip(that).inject(true) { |still_same, a|
263
+ if !still_same
264
+ false
265
+ elsif a.length != 2
266
+ false
267
+ else
268
+ a[0] == a[1]
269
+ end
270
+ }
271
+ end
272
+
273
+ def scan_left(n, &block)
274
+ Seq.new(@array.inject([n, [n]]) { |last_and_array, x|
275
+ last, array = last_and_array[0], last_and_array[1]
276
+ applied = yield last, x
277
+ [applied, array.push(applied)]
278
+ }[1])
279
+ end
280
+
281
+ def scan_right(n, &block)
282
+ Seq.new(@array.reverse.inject([n, [n]]) { |last_and_array, x|
283
+ last, array = last_and_array[0], last_and_array[1]
284
+ applied = yield last, x
285
+ [applied, array.push(applied)]
286
+ }[1].reverse)
287
+ end
288
+
289
+ def size
290
+ @array.length
291
+ end
292
+
293
+ def slice(from, until_n)
294
+ Seq.new(@array.drop(from).take(until_n - from))
295
+ end
296
+
297
+ def sliding(len)
298
+ result = []
299
+ @array.each_with_index do |e, idx|
300
+ if idx < (@array.length - len + 1)
301
+ result.push(@array.slice(idx, len))
302
+ end
303
+ end
304
+ Seq.new(result)
305
+ end
306
+
307
+ def sort_with(&predicate)
308
+ @array.sort(&predicate)
309
+ end
310
+
311
+ def span(&predicate)
312
+ result = @array.inject([true, [], []]) { |z, x|
313
+ still_matched, first, second = z[0], z[1], z[2]
314
+ if !still_matched
315
+ [false, first, second.push(x)]
316
+ elsif yield x
317
+ [true, first.push(x), second]
318
+ else
319
+ [false, first, second.push(x)]
320
+ end
321
+ }
322
+ Seq.new([result[1], result[2]])
323
+ end
324
+
325
+ def split_at(n)
326
+ Seq.new([@array.take(n), @array.drop(n)])
327
+ end
328
+
329
+ def starts_with(that)
330
+ if that.nil? || that.length > @array.length
331
+ return false
332
+ end
333
+ this_start = @array.take(that.length)
334
+ this_start.zip(that).inject(true) { |all_matched, a|
335
+ if !all_matched
336
+ false
337
+ elsif a.length != 2
338
+ false
339
+ else
340
+ a[0] == a[1]
341
+ end
342
+ }
343
+ end
344
+
345
+ def sum
346
+ @array.inject(0) { |z, x| z + x }
347
+ end
348
+
349
+ def tail
350
+ Seq.new(@array.drop(1))
351
+ end
352
+
353
+ def take(n)
354
+ Seq.new(@array.take(n))
355
+ end
356
+
357
+ def take_right(n)
358
+ Seq.new(@array.reverse.take(n).reverse)
359
+ end
360
+
361
+ def take_while(&predicate)
362
+ Seq.new(@array.inject([false, []]) { |passed, x|
363
+ is_already_unmatched, result = passed[0], passed[1]
364
+ if is_already_unmatched
365
+ passed
366
+ elsif yield x
367
+ [false, result.push(x)]
368
+ else
369
+ [true, result]
370
+ end
371
+ }[1])
372
+ end
373
+
374
+ def union(that)
375
+ Seq.new(@array.concat(that))
376
+ end
377
+
378
+ def updated(idx, elm)
379
+ Seq.new(@array.fill(elm, idx, 1))
380
+ end
381
+
382
+ def zip(that)
383
+ Seq.new(@array.zip(that).select { |a, b| !a.nil? && !b.nil? })
384
+ end
385
+
386
+ def zip_with_index
387
+ with_index = []
388
+ @array.each_with_index do |v, idx|
389
+ with_index.push([v, idx])
390
+ end
391
+ with_index
392
+ end
393
+
394
+ end
395
+ end