tbpgr_utils 0.0.28 → 0.0.29

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.
data/README.md CHANGED
@@ -31,6 +31,7 @@ Or install it yourself as:
31
31
  |[TbpgrUtils Array#together_delete_if](#arraytogether_delete_if) |together version of Array#delete_if. together_delete_if has alias :tdelete_if |
32
32
  |[TbpgrUtils Array#together_empty?](#arraytogether_empty) |together version of Array#empty?. together_empty? has alias :tempty? |
33
33
  |[TbpgrUtils Array#together_fill](#arraytogether_fill) |together version of Array#fill. together_fill has alias :tfill |
34
+ |[TbpgrUtils Array#together_first](#arraytogether_first) |together version of Array#first. together_first has alias :tfirst |
34
35
  |[TbpgrUtils Array#together_map](#arraytogether_mapor-tmap-together_collect-tcollect) |together version of Enumerable#map. together_map has aliases [:tmap, :together_collect, :tcollect] |
35
36
  |[TbpgrUtils Array#together_map!](#arraytogether_map-1or-tmap-1-together_collect-1-tcollect-1) |together version of Enumerable#map!. together_map! has aliases [:tmap!, :together_collect!, :tcollect!] |
36
37
  |[TbpgrUtils Array#together_reduce](#arraytogether_reduceor-treduce-together_inject-tinject) |together version of Enumerable#reduce. together_reduce has aliases [:treduce, :together_inject, :tinject] |
@@ -40,7 +41,7 @@ Or install it yourself as:
40
41
  |[AttributesInitializable::ClassMethods.attr_accessor_init](#attributesinitializableclassmethodsattr_accessor_init) |generate attr_accessor + initializer |
41
42
  |[AttributesInitializable::ClassMethods.attr_reader_init](#attributesinitializableclassmethodsattr_reader_init) |generate attr_reader + initializer |
42
43
  |[AttributesInitializable::ClassMethods.attr_writer init](#attributesinitializableclassmethodsattr_writer_init) |generate attr_writer + initializer |
43
- |[TbpgrUtils File.insert_bom](#fileinsert_bom) |insert BOM to UTF-8 File |
44
+ |[TbpgrUtils File.insert_bom](#fileinsert_bom) |insert BOM to UTF-8 File |
44
45
  |[Ghostable module](#ghostable) |help to create ghost method(dynamic method define by ussing method_missing + pattern-method-name) |
45
46
  |[TbpgrUtils Kernel#bulk_define_methods](#kernelbulk_define_methods) |define methods to classes. methods have simple return value. |
46
47
  |[TestToolbox Kernel#capture_stdout](#kernelcapture_stdout) |capture STDOUT |
@@ -288,6 +289,45 @@ print ret # => [[1, 2, 4, 5, 6], [6, 7, 4, 5, 6]]
288
289
 
289
290
  [back to list](#list)
290
291
 
292
+ ### Array#together_first
293
+ no args case
294
+ ~~~ruby
295
+ require 'tbpgr_utils'
296
+
297
+ lists = [[*1..5], [*6..10]]
298
+ ret = lists.together_first
299
+ print ret # => [1, 6]
300
+ ~~~
301
+
302
+ has args 2 case
303
+ ~~~ruby
304
+ require 'tbpgr_utils'
305
+
306
+ lists = [[*1..5], [*6..10]]
307
+ ret = lists.together_first 2
308
+ print ret # => [[1, 2], [6, 7]]
309
+ ~~~
310
+
311
+ has args 0 case
312
+ ~~~ruby
313
+ require 'tbpgr_utils'
314
+
315
+ lists = [[*1..5], [*6..10]]
316
+ ret = lists.together_first 0
317
+ print ret # => [[], []]
318
+ ~~~
319
+
320
+ has args over size case
321
+ ~~~ruby
322
+ require 'tbpgr_utils'
323
+
324
+ lists = [[*1..5], [*6..10]]
325
+ ret = lists.together_first 6
326
+ print ret # => [[*1..5], [*6..10]]
327
+ ~~~
328
+
329
+ [back to list](#list)
330
+
291
331
  ### Array#together_map(or tmap, together_collect, tcollect)
292
332
  ~~~ruby
293
333
  require 'tbpgr_utils'
@@ -1031,6 +1071,7 @@ if you are Sublime Text2 user, you can use snippet for TbpgrUtils.
1031
1071
  https://github.com/tbpgr/tbpgr_utils_snippets
1032
1072
 
1033
1073
  ## History
1074
+ * version 0.0.29 : add Array#together_first(alias tfirst).
1034
1075
  * version 0.0.28 : add Array#together_fill(alias tfill). add File.insert_bom.
1035
1076
  * version 0.0.27 : add Array#together_empty?(alias tempty?)
1036
1077
  * version 0.0.26 : add Array#together_delete_if(alias tdelete_if)
@@ -1,454 +1,484 @@
1
- # encoding: utf-8
2
- require 'open_classes/object'
3
- require 'open_classes/module'
4
-
5
- # Array
6
- class Array
7
- # Arrays loop together.
8
- #
9
- # alpha = %w{one two three}
10
- # numbers = %w{1 2 3}
11
- # [alpha, numbers].together do |first, second|
12
- # print "#{first}:#{second}\n" # => output one:1, two:2, three:3
13
- # end
14
- def together
15
- if_not_contain_array_rails_type_error
16
- first.each_with_index do |i_v, i|
17
- eval_each_str = get_args_str_for_together i
18
- instance_eval "yield(#{eval_each_str})"
19
- end
20
- end
21
-
22
- # Arrays loop together with index.
23
- #
24
- # alpha = %w{one two three}
25
- # numbers = %w{1 2 3}
26
- # [alpha, numbers].together_with_index do |first, second, index|
27
- # print "#{index.to_s}:#{first}:#{second}\n" # => output 0:one:1, 1:two:2, 2:three:3
28
- # end
29
- def together_with_index
30
- if_not_contain_array_rails_type_error
31
- first.each_with_index do |i_v, i|
32
- eval_each_str = get_args_str_for_together i, true
33
- instance_eval "yield(#{eval_each_str})"
34
- end
35
- end
36
-
37
- # Arrays together map.
38
- #
39
- # together_map has aliases [:tmap, :together_collect, :tcollect]
40
- #
41
- # if you want to single Array return
42
- # alpha = %w{one two three}
43
- # numbers = %w{1 2 3}
44
- # print [alpha, numbers].together_map do |first, second|
45
- # "#{first}:#{second}\n"
46
- # end # => output one:1, two:2, three:3
47
- #
48
- # if you want to multi Array return
49
- # alpha = %w{one two three}
50
- # numbers = %w{1 2 3}
51
- # print [alpha, numbers].together_map do |first, second|
52
- # ["#{first}:#{second}", "#{second}:#{first}"]
53
- # end # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
54
- def together_map
55
- if_not_contain_array_rails_type_error
56
- ret = []
57
- first.each_with_index do |i_v, i|
58
- eval_each_str = get_args_str_for_together i
59
- each_ret = instance_eval "yield(#{eval_each_str})"
60
- ret = set_together_each_return_map(ret, each_ret, i)
61
- end
62
- ret
63
- end
64
-
65
-
66
- # Arrays together map!.
67
- #
68
- # together_map! has aliases [:tmap!, :together_collect!, :tcollect!]
69
- #
70
- # if you want to single Array return
71
- # alpha = %w{one two three}
72
- # numbers = %w{1 2 3}
73
- # ary = [alpha, numbers]
74
- # ret = ary.together_map! do |first, second|
75
- # "#{first}:#{second}"
76
- # end
77
- # print ret # => output ['one:1', 'two:2', 'three:3']
78
- # print ary # => output ['one:1', 'two:2', 'three:3']
79
- #
80
- # if you want to multi Array return
81
- # alpha = %w{one two three}
82
- # numbers = %w{1 2 3}
83
- # ary = [alpha, numbers]
84
- # ret = ary.together_map! do |first, second|
85
- # ["#{first}:#{second}", "#{second}:#{first}"]
86
- # end
87
- # print ret # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
88
- # print ary # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
89
- def together_map!
90
- if_not_contain_array_rails_type_error
91
- ret = []
92
- first.each_with_index do |i_v, i|
93
- eval_each_str = get_args_str_for_together i
94
- each_ret = instance_eval "yield(#{eval_each_str})"
95
- ret = set_together_each_return_map(ret, each_ret, i)
96
- end
97
- clear
98
- ret.each { |v|self << v }
99
- end
100
-
101
- # Arrays loop together select.
102
- #
103
- # together_select has aliases [:tselect, :together_find_all, :tfindall]
104
- #
105
- # if you want to single Array return
106
- # firsts = [1, 2, 3, 4]
107
- # seconds = [4, 2, 3, 1]
108
- # ret = [firsts, seconds].together_select{|first, second|first == second}
109
- # print ret # => output [[2, 3], [2, 3]]
110
- #
111
- # if you want to multi Array return
112
- # firsts = [1, 2, 3, 4]
113
- # seconds = [4, 2, 3, 1]
114
- # ret = [firsts, seconds].together_select{|first, second|[first.odd?, second.even?]}
115
- # print ret # => output [[1, 3], [4, 2]]
116
- def together_select
117
- if_not_contain_array_rails_type_error
118
- ret = []
119
- first.each_with_index do |i_v, i|
120
- eval_each_str = get_args_str_for_together i
121
- each_ret = instance_eval "yield(#{eval_each_str})"
122
- ret = set_together_each_return_select(ret, each_ret, i)
123
- end
124
- ret
125
- end
126
-
127
- # Arrays loop together reduce.
128
- #
129
- # together_reduce has aliases [:treduce, :together_inject, :tinject]
130
- #
131
- # if you want to single return
132
- # firsts = [1, 2, 3, 4]
133
- # seconds = [4, 2, 3, 1]
134
- # ret = [firsts, seconds].together_reduce{|memo, first, second|memo + first + second}
135
- # print ret # => output 20
136
- #
137
- # if you want to single return with init value
138
- # firsts = [1, 2, 3, 4]
139
- # seconds = [4, 2, 3, 1]
140
- # ret = [firsts, seconds].together_reduce(10){|memo, first, second|memo + first + second}
141
- # print ret # => output 30
142
- #
143
- # if you want to single return with init string value
144
- # firsts = %w{a b c}
145
- # seconds = %w{1 2 3}
146
- # ret = [firsts, seconds].together_reduce('start-'){|memo, first, second|memo + first + second}
147
- # print ret # => output 'start-a1b2c3'
148
- #
149
- # if you want to single return with init Array value
150
- # firsts = [1, 2, 3, 4]
151
- # seconds = [4, 2, 3, 1]
152
- # ret = [firsts, seconds].together_reduce([]){|memo, first, second|memo << first + second}
153
- # print ret # => output [5, 4, 6, 5]
154
- #
155
- # if you want to single return with init Hash value
156
- # firsts = [1, 2, 3, 4]
157
- # seconds = [4, 2, 3, 1]
158
- # ret = [firsts, seconds].together_reduce({}){|memo, first, second|memo[first] = second;memo}
159
- # print ret # => output {1=>4, 2=>2, 3=>3, 4=>1}
160
- def together_reduce(init = nil)
161
- if_not_contain_array_rails_type_error
162
- memo = initial_memo init
163
- first.each_with_index do |i_v, i|
164
- eval_each_str = get_args_str_for_together i
165
- memo = instance_eval "yield(memo, #{eval_each_str})"
166
- end
167
- memo
168
- end
169
-
170
- # Arrays bulk concat.
171
- #
172
- # together_concat has alias :tconcat
173
- #
174
- # alpha = %w{one two three}
175
- # numbers = %w{1 2 3}
176
- # [alpha, numbers].together do |first, second|
177
- # print "#{first}:#{second}\n" # => output one:1, two:2, three:3
178
- # end
179
- def together_concat(other)
180
- if_not_contain_array_rails_type_error
181
- each { |list|list.concat other }
182
- end
183
-
184
- # Arrays bulk at.
185
- #
186
- # together_at has alias :tat
187
- #
188
- # same elements size case
189
- # alpha = %w{one two three}
190
- # numbers = %w{1 2 3}
191
- # [alpha, numbers].together_at 2 # => output ['three', 3]
192
- #
193
- # different elements size case
194
- # alpha = %w{one two three}
195
- # numbers = %w{1 2}
196
- # [alpha, numbers].together_at 2 # => output ['three', nil]
197
- def together_at(index)
198
- if_not_contain_array_rails_type_error
199
- reduce([]) { |ats, list|ats << list.at(index) }
200
- end
201
-
202
- # Arrays bulk clear.
203
- #
204
- # together_clear has alias :tclear
205
- #
206
- # same elements size case
207
- # alpha = %w{one two three}
208
- # numbers = %w{1 2 3}
209
- # [alpha, numbers].together_clear # => output [[],[]]
210
- def together_clear
211
- if_not_contain_array_rails_type_error
212
- each { |list|list.clear }
213
- end
214
-
215
- # Arrays bulk compact.(immutable)
216
- #
217
- # together_compact has alias :tcompact
218
- #
219
- # same elements size case
220
- # alpha = ['a','b','c', nil,'d']
221
- # numbers = [1, 2, nil, 3]
222
- # lists = [alpha, numbers]
223
- # ret = lists.together_compact
224
- # print lists # => output [['a','b','c', nil,'d'], [1, 2, nil, 3]]
225
- # print ret # => output [['a','b','c','d'], [1, 2, 3]]
226
- def together_compact
227
- if_not_contain_array_rails_type_error
228
- reduce([]) { |ret, list|ret << list.compact }
229
- end
230
-
231
- # Arrays bulk compact!.(mutable)
232
- #
233
- # together_compact! has alias :tcompact!
234
- #
235
- # same elements size case
236
- # alpha = ['a','b','c', nil,'d']
237
- # numbers = [1, 2, nil, 3]
238
- # lists = [alpha, numbers]
239
- # ret = lists.together_compact!
240
- # print lists # => output [['a','b','c','d'], [1, 2, 3]]
241
- # print ret # => output [['a','b','c','d'], [1, 2, 3]]
242
- def together_compact!
243
- if_not_contain_array_rails_type_error
244
- each { |list|list.compact! }
245
- end
246
-
247
- # Arrays bulk delete.
248
- #
249
- # together_delete has alias :tdelete
250
- #
251
- # if delete target is exist
252
- # child1 = [1, 2, 3, 4]
253
- # child2 = [2, 3, 4, 5]
254
- # lists = [child1, child2]
255
- # ret = lists.together_delete 2
256
- # print ret # => 2
257
- # print lists # => output [[1, 3, 4], [3, 4, 5]]
258
- #
259
- # if delete target is not exist
260
- # child1 = [1, 2, 3, 4]
261
- # child2 = [2, 3, 4, 5]
262
- # lists = [child1, child2]
263
- # ret = lists.together_delete 6
264
- # print ret # => nil
265
- # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
266
- #
267
- # if delete target is not exist and use block
268
- # child1 = [1, 2, 3, 4]
269
- # child2 = [2, 3, 4, 5]
270
- # lists = [child1, child2]
271
- # ret = lists.together_delete(6) { 999 }
272
- # print ret # => 999
273
- # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
274
- def together_delete(value)
275
- if_not_contain_array_rails_type_error
276
- ret = []
277
- each { |list|ret << list.delete(value) }
278
- default_return = block_given? ? yield : nil
279
- ret.compact.size == 0 ? default_return : value
280
- end
281
-
282
- # Arrays bulk delete_at.
283
- #
284
- # together_delete_at has alias :tdelete_at
285
- #
286
- # if delete_at target is exist
287
- # child1 = [1, 2, 3, 4]
288
- # child2 = [2, 3, 4, 5]
289
- # lists = [child1, child2]
290
- # ret = lists.together_delete_at 2
291
- # print ret # => [3, 4]
292
- # print lists # => output [[1, 2, 4], [2, 3, 5]]
293
- #
294
- # if delete_at target is not exist
295
- # child1 = [1, 2, 3, 4]
296
- # child2 = [2, 3, 4, 5]
297
- # lists = [child1, child2]
298
- # ret = lists.together_delete_at 6
299
- # print ret # => [nil, nil]
300
- # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
301
- #
302
- # if delete_at target is exist(minus index)
303
- # child1 = [1, 2, 3, 4]
304
- # child2 = [2, 3, 4, 5]
305
- # lists = [child1, child2]
306
- # ret = lists.together_delete_at -3
307
- # print ret # => [2, 3]
308
- # print lists # => output [[1, 3, 4], [2, 4, 5]]
309
- def together_delete_at(index)
310
- if_not_contain_array_rails_type_error
311
- reduce([]) { |ret, list|ret << list.delete_at(index) }
312
- end
313
-
314
- # Arrays bulk delete_if.
315
- #
316
- # together_delete_if has alias :tdelete_if
317
- #
318
- # if delete_if target is exist. return self.
319
- # lists = [[1, 2, 3, 4], [6, 4, 6, 8]]
320
- # ret = lists.together_delete_if {|first, second|(first + second).odd?}
321
- # print ret # => [[2, 4], [4, 8]]
322
- #
323
- # if delete_if target is not exist. return nil.
324
- # lists = [[2, 2, 4, 4], [6, 4, 6, 8]]
325
- # ret = lists.together_delete_if {|first, second|(first + second).odd?}
326
- # print ret # => nil
327
- def together_delete_if(&block)
328
- if_not_contain_array_rails_type_error
329
- have_deleted = false
330
- first.each_with_index do |i_v, i|
331
- eval_each_str = get_args_str_for_together i
332
- is_delete = instance_eval "yield(#{eval_each_str})"
333
- if is_delete
334
- each { |e|e.delete_at i }
335
- have_deleted = true
336
- end
337
- end
338
- have_deleted ? self : nil
339
- end
340
-
341
- # Arrays bulk empty?.
342
- #
343
- # together_empty? has alias :tempty?
344
- #
345
- # empty case
346
- # lists = [[], []]
347
- # ret = lists.together_empty?
348
- # print ret # => true
349
- #
350
- # not empty case
351
- # lists = [[1], []]
352
- # ret = lists.together_empty?
353
- # print ret # => false
354
- def together_empty?
355
- if_not_contain_array_rails_type_error
356
- is_empty = true
357
- each { |list|is_empty = is_empty && list.empty? }
358
- is_empty
359
- end
360
-
361
- # Arrays bulk fill.
362
- #
363
- # together_fill has alias :tfill
364
- #
365
- # not use block case
366
- # lists = [[*1..5], [*6..10]]
367
- # ret = lists.together_fill(99)
368
- # print ret # => [[99, 99, 99, 99, 99], [99, 99, 99, 99, 99]]
369
- #
370
- # use block, no args case
371
- # lists = [[*1..5], [*6..10]]
372
- # ret = lists.together_fill { |i|(i + 1) + 1 }
373
- # print ret # => [[2, 3, 4, 5, 6], [2, 3, 4, 5, 6]]
374
- #
375
- # use block, has args case
376
- # lists = [[*1..5], [*6..10]]
377
- # ret = lists.together_fill(2) { |i|(i + 1) + 1 }
378
- # print ret # => [[1, 2, 4, 5, 6], [6, 7, 4, 5, 6]]
379
- def together_fill(fill_value = nil, &block)
380
- if_not_contain_array_rails_type_error
381
- if block
382
- fill_value = 0 if fill_value.nil?
383
- first.each_with_index do |i_v, i|
384
- next if i < fill_value
385
- each { |list|list[i] = yield(i) }
386
- end
387
- else
388
- each { |list|list.fill fill_value }
389
- end
390
- self
391
- end
392
-
393
- private
394
-
395
- def if_not_contain_array_rails_type_error
396
- each { |f|fail TypeError, "you have to use [Array1, Array2, ...] | #{f.class} is invalid" unless f.class == Array }
397
- end
398
-
399
- def get_args_for_together(i)
400
- eval_each = []
401
- each_with_index { |j_v, j|eval_each << "self[#{j}][#{i}]" }
402
- eval_each
403
- end
404
-
405
- def get_args_str_for_together(i, with_index = false)
406
- each_eval = with_index ? get_args_for_together(i) << i : get_args_for_together(i)
407
- each_eval.join(',')
408
- end
409
-
410
- def set_together_each_return_map(ret, each_ret, index)
411
- if together_return_multi?(each_ret)
412
- size.times { |i|ret << [] } if index == 0
413
- (0..(size - 1)).each { |i|ret[i] << each_ret[i] }
414
- else
415
- ret << each_ret
416
- end
417
- ret
418
- end
419
-
420
- def set_together_each_return_select(ret, each_ret, index)
421
- unless together_return_multi?(each_ret)
422
- tmp_each_ret = []
423
- size.times { tmp_each_ret << each_ret }
424
- each_ret = tmp_each_ret
425
- end
426
- size.times { |i|ret << [] } if index == 0
427
- (0..(size - 1)).each { |i|ret[i] << self[i][index] if each_ret[i] }
428
- ret
429
- end
430
-
431
- def initial_memo(init)
432
- return init unless init.nil?
433
- first.first.is_a?(Numeric) ? 0 : first.first.is_a?(String) ? '' : nil
434
- end
435
-
436
- def together_return_multi?(list)
437
- (list.class == Array && list.size == size).to_bool
438
- end
439
-
440
- alias_method :tconcat, :together_concat
441
- alias_method :tat, :together_at
442
- alias_method :tclear, :together_clear
443
- alias_method :tcompact, :together_compact
444
- alias_method :tcompact!, :together_compact!
445
- alias_method :tdelete, :together_delete
446
- alias_method :tdelete_at, :together_delete_at
447
- alias_method :tdelete_if, :together_delete_if
448
- alias_method :tempty?, :together_empty?
449
- alias_method :tfill, :together_fill
450
- alias_methods [:together_collect, :tmap, :tcollect], :together_map
451
- alias_methods [:together_collect!, :tmap!, :tcollect!], :together_map!
452
- alias_methods [:together_find_all, :tselect, :tfindall], :together_select
453
- alias_methods [:together_inject, :treduce, :tinject], :together_reduce
454
- end
1
+ # encoding: utf-8
2
+ require 'open_classes/object'
3
+ require 'open_classes/module'
4
+
5
+ # Array
6
+ class Array
7
+ # Arrays loop together.
8
+ #
9
+ # alpha = %w{one two three}
10
+ # numbers = %w{1 2 3}
11
+ # [alpha, numbers].together do |first, second|
12
+ # print "#{first}:#{second}\n" # => output one:1, two:2, three:3
13
+ # end
14
+ def together
15
+ if_not_contain_array_rails_type_error
16
+ first.each_with_index do |i_v, i|
17
+ eval_each_str = get_args_str_for_together i
18
+ instance_eval "yield(#{eval_each_str})"
19
+ end
20
+ end
21
+
22
+ # Arrays loop together with index.
23
+ #
24
+ # alpha = %w{one two three}
25
+ # numbers = %w{1 2 3}
26
+ # [alpha, numbers].together_with_index do |first, second, index|
27
+ # print "#{index.to_s}:#{first}:#{second}\n" # => output 0:one:1, 1:two:2, 2:three:3
28
+ # end
29
+ def together_with_index
30
+ if_not_contain_array_rails_type_error
31
+ first.each_with_index do |i_v, i|
32
+ eval_each_str = get_args_str_for_together i, true
33
+ instance_eval "yield(#{eval_each_str})"
34
+ end
35
+ end
36
+
37
+ # Arrays together map.
38
+ #
39
+ # together_map has aliases [:tmap, :together_collect, :tcollect]
40
+ #
41
+ # if you want to single Array return
42
+ # alpha = %w{one two three}
43
+ # numbers = %w{1 2 3}
44
+ # print [alpha, numbers].together_map do |first, second|
45
+ # "#{first}:#{second}\n"
46
+ # end # => output one:1, two:2, three:3
47
+ #
48
+ # if you want to multi Array return
49
+ # alpha = %w{one two three}
50
+ # numbers = %w{1 2 3}
51
+ # print [alpha, numbers].together_map do |first, second|
52
+ # ["#{first}:#{second}", "#{second}:#{first}"]
53
+ # end # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
54
+ def together_map
55
+ if_not_contain_array_rails_type_error
56
+ ret = []
57
+ first.each_with_index do |i_v, i|
58
+ eval_each_str = get_args_str_for_together i
59
+ each_ret = instance_eval "yield(#{eval_each_str})"
60
+ ret = set_together_each_return_map(ret, each_ret, i)
61
+ end
62
+ ret
63
+ end
64
+
65
+
66
+ # Arrays together map!.
67
+ #
68
+ # together_map! has aliases [:tmap!, :together_collect!, :tcollect!]
69
+ #
70
+ # if you want to single Array return
71
+ # alpha = %w{one two three}
72
+ # numbers = %w{1 2 3}
73
+ # ary = [alpha, numbers]
74
+ # ret = ary.together_map! do |first, second|
75
+ # "#{first}:#{second}"
76
+ # end
77
+ # print ret # => output ['one:1', 'two:2', 'three:3']
78
+ # print ary # => output ['one:1', 'two:2', 'three:3']
79
+ #
80
+ # if you want to multi Array return
81
+ # alpha = %w{one two three}
82
+ # numbers = %w{1 2 3}
83
+ # ary = [alpha, numbers]
84
+ # ret = ary.together_map! do |first, second|
85
+ # ["#{first}:#{second}", "#{second}:#{first}"]
86
+ # end
87
+ # print ret # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
88
+ # print ary # => output [['1:one', '2:two', '3:three'], ['one:1', 'two:2', 'three:3']]
89
+ def together_map!
90
+ if_not_contain_array_rails_type_error
91
+ ret = []
92
+ first.each_with_index do |i_v, i|
93
+ eval_each_str = get_args_str_for_together i
94
+ each_ret = instance_eval "yield(#{eval_each_str})"
95
+ ret = set_together_each_return_map(ret, each_ret, i)
96
+ end
97
+ clear
98
+ ret.each { |v|self << v }
99
+ end
100
+
101
+ # Arrays loop together select.
102
+ #
103
+ # together_select has aliases [:tselect, :together_find_all, :tfindall]
104
+ #
105
+ # if you want to single Array return
106
+ # firsts = [1, 2, 3, 4]
107
+ # seconds = [4, 2, 3, 1]
108
+ # ret = [firsts, seconds].together_select{|first, second|first == second}
109
+ # print ret # => output [[2, 3], [2, 3]]
110
+ #
111
+ # if you want to multi Array return
112
+ # firsts = [1, 2, 3, 4]
113
+ # seconds = [4, 2, 3, 1]
114
+ # ret = [firsts, seconds].together_select{|first, second|[first.odd?, second.even?]}
115
+ # print ret # => output [[1, 3], [4, 2]]
116
+ def together_select
117
+ if_not_contain_array_rails_type_error
118
+ ret = []
119
+ first.each_with_index do |i_v, i|
120
+ eval_each_str = get_args_str_for_together i
121
+ each_ret = instance_eval "yield(#{eval_each_str})"
122
+ ret = set_together_each_return_select(ret, each_ret, i)
123
+ end
124
+ ret
125
+ end
126
+
127
+ # Arrays loop together reduce.
128
+ #
129
+ # together_reduce has aliases [:treduce, :together_inject, :tinject]
130
+ #
131
+ # if you want to single return
132
+ # firsts = [1, 2, 3, 4]
133
+ # seconds = [4, 2, 3, 1]
134
+ # ret = [firsts, seconds].together_reduce{|memo, first, second|memo + first + second}
135
+ # print ret # => output 20
136
+ #
137
+ # if you want to single return with init value
138
+ # firsts = [1, 2, 3, 4]
139
+ # seconds = [4, 2, 3, 1]
140
+ # ret = [firsts, seconds].together_reduce(10){|memo, first, second|memo + first + second}
141
+ # print ret # => output 30
142
+ #
143
+ # if you want to single return with init string value
144
+ # firsts = %w{a b c}
145
+ # seconds = %w{1 2 3}
146
+ # ret = [firsts, seconds].together_reduce('start-'){|memo, first, second|memo + first + second}
147
+ # print ret # => output 'start-a1b2c3'
148
+ #
149
+ # if you want to single return with init Array value
150
+ # firsts = [1, 2, 3, 4]
151
+ # seconds = [4, 2, 3, 1]
152
+ # ret = [firsts, seconds].together_reduce([]){|memo, first, second|memo << first + second}
153
+ # print ret # => output [5, 4, 6, 5]
154
+ #
155
+ # if you want to single return with init Hash value
156
+ # firsts = [1, 2, 3, 4]
157
+ # seconds = [4, 2, 3, 1]
158
+ # ret = [firsts, seconds].together_reduce({}){|memo, first, second|memo[first] = second;memo}
159
+ # print ret # => output {1=>4, 2=>2, 3=>3, 4=>1}
160
+ def together_reduce(init = nil)
161
+ if_not_contain_array_rails_type_error
162
+ memo = initial_memo init
163
+ first.each_with_index do |i_v, i|
164
+ eval_each_str = get_args_str_for_together i
165
+ memo = instance_eval "yield(memo, #{eval_each_str})"
166
+ end
167
+ memo
168
+ end
169
+
170
+ # Arrays bulk concat.
171
+ #
172
+ # together_concat has alias :tconcat
173
+ #
174
+ # alpha = %w{one two three}
175
+ # numbers = %w{1 2 3}
176
+ # [alpha, numbers].together do |first, second|
177
+ # print "#{first}:#{second}\n" # => output one:1, two:2, three:3
178
+ # end
179
+ def together_concat(other)
180
+ if_not_contain_array_rails_type_error
181
+ each { |list|list.concat other }
182
+ end
183
+
184
+ # Arrays bulk at.
185
+ #
186
+ # together_at has alias :tat
187
+ #
188
+ # same elements size case
189
+ # alpha = %w{one two three}
190
+ # numbers = %w{1 2 3}
191
+ # [alpha, numbers].together_at 2 # => output ['three', 3]
192
+ #
193
+ # different elements size case
194
+ # alpha = %w{one two three}
195
+ # numbers = %w{1 2}
196
+ # [alpha, numbers].together_at 2 # => output ['three', nil]
197
+ def together_at(index)
198
+ if_not_contain_array_rails_type_error
199
+ reduce([]) { |ats, list|ats << list.at(index) }
200
+ end
201
+
202
+ # Arrays bulk clear.
203
+ #
204
+ # together_clear has alias :tclear
205
+ #
206
+ # same elements size case
207
+ # alpha = %w{one two three}
208
+ # numbers = %w{1 2 3}
209
+ # [alpha, numbers].together_clear # => output [[],[]]
210
+ def together_clear
211
+ if_not_contain_array_rails_type_error
212
+ each { |list|list.clear }
213
+ end
214
+
215
+ # Arrays bulk compact.(immutable)
216
+ #
217
+ # together_compact has alias :tcompact
218
+ #
219
+ # same elements size case
220
+ # alpha = ['a','b','c', nil,'d']
221
+ # numbers = [1, 2, nil, 3]
222
+ # lists = [alpha, numbers]
223
+ # ret = lists.together_compact
224
+ # print lists # => output [['a','b','c', nil,'d'], [1, 2, nil, 3]]
225
+ # print ret # => output [['a','b','c','d'], [1, 2, 3]]
226
+ def together_compact
227
+ if_not_contain_array_rails_type_error
228
+ reduce([]) { |ret, list|ret << list.compact }
229
+ end
230
+
231
+ # Arrays bulk compact!.(mutable)
232
+ #
233
+ # together_compact! has alias :tcompact!
234
+ #
235
+ # same elements size case
236
+ # alpha = ['a','b','c', nil,'d']
237
+ # numbers = [1, 2, nil, 3]
238
+ # lists = [alpha, numbers]
239
+ # ret = lists.together_compact!
240
+ # print lists # => output [['a','b','c','d'], [1, 2, 3]]
241
+ # print ret # => output [['a','b','c','d'], [1, 2, 3]]
242
+ def together_compact!
243
+ if_not_contain_array_rails_type_error
244
+ each { |list|list.compact! }
245
+ end
246
+
247
+ # Arrays bulk delete.
248
+ #
249
+ # together_delete has alias :tdelete
250
+ #
251
+ # if delete target is exist
252
+ # child1 = [1, 2, 3, 4]
253
+ # child2 = [2, 3, 4, 5]
254
+ # lists = [child1, child2]
255
+ # ret = lists.together_delete 2
256
+ # print ret # => 2
257
+ # print lists # => output [[1, 3, 4], [3, 4, 5]]
258
+ #
259
+ # if delete target is not exist
260
+ # child1 = [1, 2, 3, 4]
261
+ # child2 = [2, 3, 4, 5]
262
+ # lists = [child1, child2]
263
+ # ret = lists.together_delete 6
264
+ # print ret # => nil
265
+ # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
266
+ #
267
+ # if delete target is not exist and use block
268
+ # child1 = [1, 2, 3, 4]
269
+ # child2 = [2, 3, 4, 5]
270
+ # lists = [child1, child2]
271
+ # ret = lists.together_delete(6) { 999 }
272
+ # print ret # => 999
273
+ # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
274
+ def together_delete(value)
275
+ if_not_contain_array_rails_type_error
276
+ ret = []
277
+ each { |list|ret << list.delete(value) }
278
+ default_return = block_given? ? yield : nil
279
+ ret.compact.size == 0 ? default_return : value
280
+ end
281
+
282
+ # Arrays bulk delete_at.
283
+ #
284
+ # together_delete_at has alias :tdelete_at
285
+ #
286
+ # if delete_at target is exist
287
+ # child1 = [1, 2, 3, 4]
288
+ # child2 = [2, 3, 4, 5]
289
+ # lists = [child1, child2]
290
+ # ret = lists.together_delete_at 2
291
+ # print ret # => [3, 4]
292
+ # print lists # => output [[1, 2, 4], [2, 3, 5]]
293
+ #
294
+ # if delete_at target is not exist
295
+ # child1 = [1, 2, 3, 4]
296
+ # child2 = [2, 3, 4, 5]
297
+ # lists = [child1, child2]
298
+ # ret = lists.together_delete_at 6
299
+ # print ret # => [nil, nil]
300
+ # print lists # => output [[1, 2, 3, 4], [2, 3, 4, 5]]
301
+ #
302
+ # if delete_at target is exist(minus index)
303
+ # child1 = [1, 2, 3, 4]
304
+ # child2 = [2, 3, 4, 5]
305
+ # lists = [child1, child2]
306
+ # ret = lists.together_delete_at -3
307
+ # print ret # => [2, 3]
308
+ # print lists # => output [[1, 3, 4], [2, 4, 5]]
309
+ def together_delete_at(index)
310
+ if_not_contain_array_rails_type_error
311
+ reduce([]) { |ret, list|ret << list.delete_at(index) }
312
+ end
313
+
314
+ # Arrays bulk delete_if.
315
+ #
316
+ # together_delete_if has alias :tdelete_if
317
+ #
318
+ # if delete_if target is exist. return self.
319
+ # lists = [[1, 2, 3, 4], [6, 4, 6, 8]]
320
+ # ret = lists.together_delete_if {|first, second|(first + second).odd?}
321
+ # print ret # => [[2, 4], [4, 8]]
322
+ #
323
+ # if delete_if target is not exist. return nil.
324
+ # lists = [[2, 2, 4, 4], [6, 4, 6, 8]]
325
+ # ret = lists.together_delete_if {|first, second|(first + second).odd?}
326
+ # print ret # => nil
327
+ def together_delete_if(&block)
328
+ if_not_contain_array_rails_type_error
329
+ have_deleted = false
330
+ first.each_with_index do |i_v, i|
331
+ eval_each_str = get_args_str_for_together i
332
+ is_delete = instance_eval "yield(#{eval_each_str})"
333
+ if is_delete
334
+ each { |e|e.delete_at i }
335
+ have_deleted = true
336
+ end
337
+ end
338
+ have_deleted ? self : nil
339
+ end
340
+
341
+ # Arrays bulk empty?.
342
+ #
343
+ # together_empty? has alias :tempty?
344
+ #
345
+ # empty case
346
+ # lists = [[], []]
347
+ # ret = lists.together_empty?
348
+ # print ret # => true
349
+ #
350
+ # not empty case
351
+ # lists = [[1], []]
352
+ # ret = lists.together_empty?
353
+ # print ret # => false
354
+ def together_empty?
355
+ if_not_contain_array_rails_type_error
356
+ is_empty = true
357
+ each { |list|is_empty = is_empty && list.empty? }
358
+ is_empty
359
+ end
360
+
361
+ # Arrays bulk fill.
362
+ #
363
+ # together_fill has alias :tfill
364
+ #
365
+ # not use block case
366
+ # lists = [[*1..5], [*6..10]]
367
+ # ret = lists.together_fill(99)
368
+ # print ret # => [[99, 99, 99, 99, 99], [99, 99, 99, 99, 99]]
369
+ #
370
+ # use block, no args case
371
+ # lists = [[*1..5], [*6..10]]
372
+ # ret = lists.together_fill { |i|(i + 1) + 1 }
373
+ # print ret # => [[2, 3, 4, 5, 6], [2, 3, 4, 5, 6]]
374
+ #
375
+ # use block, has args case
376
+ # lists = [[*1..5], [*6..10]]
377
+ # ret = lists.together_fill(2) { |i|(i + 1) + 1 }
378
+ # print ret # => [[1, 2, 4, 5, 6], [6, 7, 4, 5, 6]]
379
+ def together_fill(fill_value = nil, &block)
380
+ if_not_contain_array_rails_type_error
381
+ if block
382
+ fill_value = 0 if fill_value.nil?
383
+ first.each_with_index do |i_v, i|
384
+ next if i < fill_value
385
+ each { |list|list[i] = yield(i) }
386
+ end
387
+ else
388
+ each { |list|list.fill fill_value }
389
+ end
390
+ self
391
+ end
392
+
393
+ # Arrays bulk first.
394
+ #
395
+ # together_first has alias :tfirst
396
+ #
397
+ # no args case
398
+ # lists = [[*1..5], [*6..10]]
399
+ # ret = lists.together_first
400
+ # print ret # => [1, 6]
401
+ #
402
+ # has args 2 case
403
+ # lists = [[*1..5], [*6..10]]
404
+ # ret = lists.together_first 2
405
+ # print ret # => [[1, 2], [6, 7]]
406
+ #
407
+ # has args 0 case
408
+ # lists = [[*1..5], [*6..10]]
409
+ # ret = lists.together_first 0
410
+ # print ret # => [[], []]
411
+ #
412
+ # has args over size case
413
+ # lists = [[*1..5], [*6..10]]
414
+ # ret = lists.together_first 6
415
+ # print ret # => [[*1..5], [*6..10]]
416
+ def together_first(index = nil)
417
+ if_not_contain_array_rails_type_error
418
+ each_return = index == 0 ? '[]' : index.nil? ? 'list.first' : 'list[0..index - 1]'
419
+ reduce([]) { |ret, list|ret << eval(each_return, binding) }
420
+ end
421
+
422
+ private
423
+
424
+ def if_not_contain_array_rails_type_error
425
+ each { |f|fail TypeError, "you have to use [Array1, Array2, ...] | #{f.class} is invalid" unless f.class == Array }
426
+ end
427
+
428
+ def get_args_for_together(i)
429
+ eval_each = []
430
+ each_with_index { |j_v, j|eval_each << "self[#{j}][#{i}]" }
431
+ eval_each
432
+ end
433
+
434
+ def get_args_str_for_together(i, with_index = false)
435
+ each_eval = with_index ? get_args_for_together(i) << i : get_args_for_together(i)
436
+ each_eval.join(',')
437
+ end
438
+
439
+ def set_together_each_return_map(ret, each_ret, index)
440
+ if together_return_multi?(each_ret)
441
+ size.times { |i|ret << [] } if index == 0
442
+ (0..(size - 1)).each { |i|ret[i] << each_ret[i] }
443
+ else
444
+ ret << each_ret
445
+ end
446
+ ret
447
+ end
448
+
449
+ def set_together_each_return_select(ret, each_ret, index)
450
+ unless together_return_multi?(each_ret)
451
+ tmp_each_ret = []
452
+ size.times { tmp_each_ret << each_ret }
453
+ each_ret = tmp_each_ret
454
+ end
455
+ size.times { |i|ret << [] } if index == 0
456
+ (0..(size - 1)).each { |i|ret[i] << self[i][index] if each_ret[i] }
457
+ ret
458
+ end
459
+
460
+ def initial_memo(init)
461
+ return init unless init.nil?
462
+ first.first.is_a?(Numeric) ? 0 : first.first.is_a?(String) ? '' : nil
463
+ end
464
+
465
+ def together_return_multi?(list)
466
+ (list.class == Array && list.size == size).to_bool
467
+ end
468
+
469
+ alias_method :tconcat, :together_concat
470
+ alias_method :tat, :together_at
471
+ alias_method :tclear, :together_clear
472
+ alias_method :tcompact, :together_compact
473
+ alias_method :tcompact!, :together_compact!
474
+ alias_method :tdelete, :together_delete
475
+ alias_method :tdelete_at, :together_delete_at
476
+ alias_method :tdelete_if, :together_delete_if
477
+ alias_method :tempty?, :together_empty?
478
+ alias_method :tfill, :together_fill
479
+ alias_method :tfirst, :together_first
480
+ alias_methods [:together_collect, :tmap, :tcollect], :together_map
481
+ alias_methods [:together_collect!, :tmap!, :tcollect!], :together_map!
482
+ alias_methods [:together_find_all, :tselect, :tfindall], :together_select
483
+ alias_methods [:together_inject, :treduce, :tinject], :together_reduce
484
+ end