tbpgr_utils 0.0.25 → 0.0.26

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -28,6 +28,7 @@ Or install it yourself as:
28
28
  |[TbpgrUtils Array#together_concat](#arraytogether_concat) |together version of Array#concat. together_concat has alias :tconcat |
29
29
  |[TbpgrUtils Array#together_delete](#arraytogether_delete) |together version of Array#delete. together_delete has alias :tdelete |
30
30
  |[TbpgrUtils Array#together_delete_at](#arraytogether_delete_at) |together version of Array#delete_at. together_delete_at has alias :tdelete_at |
31
+ |[TbpgrUtils Array#together_delete_if](#arraytogether_delete_if) |together version of Array#delete_if. together_delete_if has alias :tdelete_if |
31
32
  |[TbpgrUtils Array#together_map](#arraytogether_mapor-tmap-together_collect-tcollect) |together version of Enumerable#map. together_map has aliases [:tmap, :together_collect, :tcollect] |
32
33
  |[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!] |
33
34
  |[TbpgrUtils Array#together_reduce](#arraytogether_reduceor-treduce-together_inject-tinject) |together version of Enumerable#reduce. together_reduce has aliases [:treduce, :together_inject, :tinject] |
@@ -212,6 +213,27 @@ print lists # => output [[1, 3, 4], [2, 4, 5]]
212
213
 
213
214
  [back to list](#list)
214
215
 
216
+ ### Array#together_delete_if
217
+ if delete_if target is exist
218
+ ~~~ruby
219
+ require 'tbpgr_utils'
220
+
221
+ lists = [[1, 2, 3, 4], [6, 4, 6, 8]]
222
+ ret = lists.together_delete_if {|first, second|(first + second).odd?}
223
+ print ret # => [[2, 4], [4, 8]]
224
+ ~~~
225
+
226
+ if delete_if target is not exist. return nil.
227
+ ~~~ruby
228
+ require 'tbpgr_utils'
229
+
230
+ lists = [[2, 2, 4, 4], [6, 4, 6, 8]]
231
+ ret = lists.together_delete_if {|first, second|(first + second).odd?}
232
+ print ret # => nil
233
+ ~~~
234
+
235
+ [back to list](#list)
236
+
215
237
  ### Array#together_map(or tmap, together_collect, tcollect)
216
238
  ~~~ruby
217
239
  require 'tbpgr_utils'
@@ -936,6 +958,7 @@ if you are Sublime Text2 user, you can use snippet for TbpgrUtils.
936
958
  https://github.com/tbpgr/tbpgr_utils_snippets
937
959
 
938
960
  ## History
961
+ * version 0.0.26 : add Array#together_delete_if(alias tdelete_if)
939
962
  * version 0.0.25 : add Array#together_delete_at(alias tdelete_at)
940
963
  * version 0.0.24 : add Array#together_delete(alias tdelete)
941
964
  * version 0.0.23 : add Array#together_map!(aliases => [tmap!, together_collect!, tcollect!])
@@ -1,382 +1,411 @@
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
- private
315
-
316
- def if_not_contain_array_rails_type_error
317
- each { |f|fail TypeError, "you have to use [Array1, Array2, ...] | #{f.class} is invalid" unless f.class == Array }
318
- end
319
-
320
- def get_args_for_together(i)
321
- eval_each = []
322
- each_with_index { |j_v, j|eval_each << "self[#{j}][#{i}]" }
323
- eval_each
324
- end
325
-
326
- def get_args_str_for_together(i, with_index = false)
327
- each_eval = with_index ? get_args_for_together(i) << i : get_args_for_together(i)
328
- each_eval.join(',')
329
- end
330
-
331
- def set_together_each_return_map(ret, each_ret, index)
332
- if together_return_multi?(each_ret)
333
- size.times { |i|ret << [] } if index == 0
334
- (0..(size - 1)).each { |i|ret[i] << each_ret[i] }
335
- else
336
- ret << each_ret
337
- end
338
- ret
339
- end
340
-
341
- # def set_together_each_return_map!(ret, each_ret, index)
342
- # if together_return_multi?(each_ret)
343
- # size.times { |i|ret << [] } if index == 0
344
- # (0..(size - 1)).each { |i|ret[i] each_ret[i] }
345
- # else
346
- # ret << each_ret
347
- # end
348
- # ret
349
- # end
350
-
351
- def set_together_each_return_select(ret, each_ret, index)
352
- unless together_return_multi?(each_ret)
353
- tmp_each_ret = []
354
- size.times { tmp_each_ret << each_ret }
355
- each_ret = tmp_each_ret
356
- end
357
- size.times { |i|ret << [] } if index == 0
358
- (0..(size - 1)).each { |i|ret[i] << self[i][index] if each_ret[i] }
359
- ret
360
- end
361
-
362
- def initial_memo(init)
363
- return init unless init.nil?
364
- first.first.is_a?(Numeric) ? 0 : first.first.is_a?(String) ? '' : nil
365
- end
366
-
367
- def together_return_multi?(list)
368
- (list.class == Array && list.size == size).to_bool
369
- end
370
-
371
- alias_method :tconcat, :together_concat
372
- alias_method :tat, :together_at
373
- alias_method :tclear, :together_clear
374
- alias_method :tcompact, :together_compact
375
- alias_method :tcompact!, :together_compact!
376
- alias_method :tdelete, :together_delete
377
- alias_method :tdelete_at, :together_delete_at
378
- alias_methods [:together_collect, :tmap, :tcollect], :together_map
379
- alias_methods [:together_collect!, :tmap!, :tcollect!], :together_map!
380
- alias_methods [:together_find_all, :tselect, :tfindall], :together_select
381
- alias_methods [:together_inject, :treduce, :tinject], :together_reduce
382
- 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
+
315
+ # Arrays bulk delete_if.
316
+ #
317
+ # together_delete_if has alias :tdelete_if
318
+ #
319
+ # if delete_if target is exist. return self.
320
+ # lists = [[1, 2, 3, 4], [6, 4, 6, 8]]
321
+ # ret = lists.together_delete_if {|first, second|(first + second).odd?}
322
+ # print ret # => [[2, 4], [4, 8]]
323
+ #
324
+ # if delete_if target is not exist. return nil.
325
+ # lists = [[2, 2, 4, 4], [6, 4, 6, 8]]
326
+ # ret = lists.together_delete_if {|first, second|(first + second).odd?}
327
+ # print ret # => nil
328
+ def together_delete_if(&block)
329
+ if_not_contain_array_rails_type_error
330
+ have_deleted = false
331
+ first.each_with_index do |i_v, i|
332
+ eval_each_str = get_args_str_for_together i
333
+ is_delete = instance_eval "yield(#{eval_each_str})"
334
+ if is_delete
335
+ each { |e|e.delete_at i }
336
+ have_deleted = true
337
+ end
338
+ end
339
+ have_deleted ? self : nil
340
+ end
341
+
342
+ private
343
+
344
+ def if_not_contain_array_rails_type_error
345
+ each { |f|fail TypeError, "you have to use [Array1, Array2, ...] | #{f.class} is invalid" unless f.class == Array }
346
+ end
347
+
348
+ def get_args_for_together(i)
349
+ eval_each = []
350
+ each_with_index { |j_v, j|eval_each << "self[#{j}][#{i}]" }
351
+ eval_each
352
+ end
353
+
354
+ def get_args_str_for_together(i, with_index = false)
355
+ each_eval = with_index ? get_args_for_together(i) << i : get_args_for_together(i)
356
+ each_eval.join(',')
357
+ end
358
+
359
+ def set_together_each_return_map(ret, each_ret, index)
360
+ if together_return_multi?(each_ret)
361
+ size.times { |i|ret << [] } if index == 0
362
+ (0..(size - 1)).each { |i|ret[i] << each_ret[i] }
363
+ else
364
+ ret << each_ret
365
+ end
366
+ ret
367
+ end
368
+
369
+ # def set_together_each_return_map!(ret, each_ret, index)
370
+ # if together_return_multi?(each_ret)
371
+ # size.times { |i|ret << [] } if index == 0
372
+ # (0..(size - 1)).each { |i|ret[i] each_ret[i] }
373
+ # else
374
+ # ret << each_ret
375
+ # end
376
+ # ret
377
+ # end
378
+
379
+ def set_together_each_return_select(ret, each_ret, index)
380
+ unless together_return_multi?(each_ret)
381
+ tmp_each_ret = []
382
+ size.times { tmp_each_ret << each_ret }
383
+ each_ret = tmp_each_ret
384
+ end
385
+ size.times { |i|ret << [] } if index == 0
386
+ (0..(size - 1)).each { |i|ret[i] << self[i][index] if each_ret[i] }
387
+ ret
388
+ end
389
+
390
+ def initial_memo(init)
391
+ return init unless init.nil?
392
+ first.first.is_a?(Numeric) ? 0 : first.first.is_a?(String) ? '' : nil
393
+ end
394
+
395
+ def together_return_multi?(list)
396
+ (list.class == Array && list.size == size).to_bool
397
+ end
398
+
399
+ alias_method :tconcat, :together_concat
400
+ alias_method :tat, :together_at
401
+ alias_method :tclear, :together_clear
402
+ alias_method :tcompact, :together_compact
403
+ alias_method :tcompact!, :together_compact!
404
+ alias_method :tdelete, :together_delete
405
+ alias_method :tdelete_at, :together_delete_at
406
+ alias_method :tdelete_if, :together_delete_if
407
+ alias_methods [:together_collect, :tmap, :tcollect], :together_map
408
+ alias_methods [:together_collect!, :tmap!, :tcollect!], :together_map!
409
+ alias_methods [:together_find_all, :tselect, :tfindall], :together_select
410
+ alias_methods [:together_inject, :treduce, :tinject], :together_reduce
411
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Tbpgr Utilities
4
4
  module TbpgrUtils
5
- VERSION = '0.0.25'
5
+ VERSION = '0.0.26'
6
6
  end
@@ -750,7 +750,6 @@ describe Array do
750
750
  end
751
751
  end
752
752
 
753
-
754
753
  context :together_delete_at do
755
754
  cases = [
756
755
  {
@@ -781,7 +780,7 @@ describe Array do
781
780
  ret: [2, 3],
782
781
  },
783
782
  {
784
- case_no: 1,
783
+ case_no: 4,
785
784
  case_title: 'valid case(use tdelete_at alias)',
786
785
  inputs: [[1, 2, 3, 4], [2, 3, 4, 5]],
787
786
  delete_value: 2,
@@ -823,4 +822,60 @@ describe Array do
823
822
  end
824
823
  end
825
824
  end
825
+
826
+ context :together_delete_if do
827
+ cases = [
828
+ {
829
+ case_no: 1,
830
+ case_title: 'valid case',
831
+ inputs: [[1, 2, 3, 4], [6, 4, 6, 8]],
832
+ delete_block_code: '(first + second).odd?',
833
+ method_name: :together_delete_if,
834
+ expected: [[2, 4], [4, 8]],
835
+ },
836
+ {
837
+ case_no: 2,
838
+ case_title: 'not have delete target value case',
839
+ inputs: [[2, 2, 4, 4], [6, 4, 6, 8]],
840
+ delete_block_code: '(first + second).odd?',
841
+ method_name: :together_delete_if,
842
+ expected: nil,
843
+ },
844
+ {
845
+ case_no: 3,
846
+ case_title: 'valid case(alias tdelete_if)',
847
+ inputs: [[1, 2, 3, 4], [6, 4, 6, 8]],
848
+ delete_block_code: '(first + second).odd?',
849
+ method_name: :tdelete_if,
850
+ expected: [[2, 4], [4, 8]],
851
+ },
852
+ ]
853
+
854
+ cases.each do |c|
855
+ it "|case_no=#{c[:case_no]}|case_title=#{c[:case_title]}" do
856
+ begin
857
+ case_before c
858
+
859
+ # -- given --
860
+ # nothing
861
+
862
+ # -- when --
863
+ actual = c[:inputs].send c[:method_name] {|first, second|eval c[:delete_block_code], binding }
864
+
865
+ # -- then --
866
+ expect(actual).to eq(c[:expected])
867
+ ensure
868
+ case_after c
869
+ end
870
+ end
871
+
872
+ def case_before(c)
873
+ # implement each case before
874
+ end
875
+
876
+ def case_after(c)
877
+ # implement each case after
878
+ end
879
+ end
880
+ end
826
881
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tbpgr_utils
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.25
4
+ version: 0.0.26
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-01 00:00:00.000000000 Z
12
+ date: 2014-02-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
16
- requirement: &21008076 !ruby/object:Gem::Requirement
16
+ requirement: &29275956 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: 4.0.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *21008076
24
+ version_requirements: *29275956
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &21007740 !ruby/object:Gem::Requirement
27
+ requirement: &29275512 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.3'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *21007740
35
+ version_requirements: *29275512
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rake
38
- requirement: &21007380 !ruby/object:Gem::Requirement
38
+ requirement: &29275164 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *21007380
46
+ version_requirements: *29275164
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rspec
49
- requirement: &21006912 !ruby/object:Gem::Requirement
49
+ requirement: &21851436 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: 2.14.1
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *21006912
57
+ version_requirements: *21851436
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: simplecov
60
- requirement: &21006408 !ruby/object:Gem::Requirement
60
+ requirement: &21851136 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: 0.8.2
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *21006408
68
+ version_requirements: *21851136
69
69
  description: Utilities
70
70
  email:
71
71
  - tbpgr@tbpgr.jp