facets 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) hide show
  1. data/AUTHORS +14 -12
  2. data/CHANGES +45 -2
  3. data/NOTES +9 -7
  4. data/lib/core/facets/1stclassmethod.rb +15 -11
  5. data/lib/core/facets/array.rb +0 -1
  6. data/lib/core/facets/array/conjoin.rb +40 -8
  7. data/lib/core/facets/array/delete.rb +8 -2
  8. data/lib/core/facets/array/indexable.rb +30 -3
  9. data/lib/core/facets/array/merge.rb +11 -0
  10. data/lib/core/facets/array/only.rb +3 -3
  11. data/lib/core/facets/array/pad.rb +4 -46
  12. data/lib/core/facets/array/rotate.rb +4 -4
  13. data/lib/core/facets/array/select.rb +2 -0
  14. data/lib/core/facets/array/splice.rb +16 -2
  15. data/lib/core/facets/array/stackable.rb +6 -40
  16. data/lib/core/facets/binding.rb +3 -0
  17. data/lib/core/facets/binding/cflow.rb +10 -64
  18. data/lib/core/facets/binding/defined.rb +10 -0
  19. data/lib/core/facets/binding/eval.rb +10 -76
  20. data/lib/core/facets/binding/here.rb +9 -0
  21. data/lib/core/facets/binding/self.rb +10 -0
  22. data/lib/core/facets/binding/vars.rb +0 -45
  23. data/lib/core/facets/boolean.rb +31 -103
  24. data/lib/core/facets/class/descendents.rb +17 -44
  25. data/lib/core/facets/comparable/bound.rb +8 -70
  26. data/lib/core/facets/comparable/cmp.rb +12 -92
  27. data/lib/core/facets/conversion.rb +122 -321
  28. data/lib/core/facets/dir/multiglob.rb +0 -13
  29. data/lib/core/facets/dir/traverse.rb +61 -111
  30. data/lib/core/facets/enumerable.rb +4 -2
  31. data/lib/core/facets/enumerable/cartesian.rb +36 -85
  32. data/lib/core/facets/enumerable/collect.rb +64 -152
  33. data/lib/core/facets/enumerable/combination.rb +40 -42
  34. data/lib/core/facets/enumerable/count.rb +99 -174
  35. data/lib/core/facets/enumerable/each.rb +86 -0
  36. data/lib/core/facets/enumerable/mash.rb +58 -0
  37. data/lib/core/facets/enumerable/permutation.rb +39 -44
  38. data/lib/core/facets/enumerable/probability.rb +16 -90
  39. data/lib/core/facets/enumerable/split.rb +113 -0
  40. data/lib/core/facets/exception/detail.rb +1 -2
  41. data/lib/core/facets/facets.rb +3 -2
  42. data/lib/core/facets/file/read.rb +4 -59
  43. data/lib/core/facets/file/topath.rb +8 -96
  44. data/lib/core/facets/file/write.rb +21 -49
  45. data/lib/core/facets/filetest/root.rb +4 -3
  46. data/lib/core/facets/functor.rb +5 -43
  47. data/lib/core/facets/hash/at.rb +7 -37
  48. data/lib/core/facets/hash/delete.rb +9 -58
  49. data/lib/core/facets/hash/has_keys.rb +4 -43
  50. data/lib/core/facets/hash/insert.rb +5 -38
  51. data/lib/core/facets/hash/inverse.rb +2 -41
  52. data/lib/core/facets/hash/iterate.rb +4 -45
  53. data/lib/core/facets/hash/keyize.rb +24 -92
  54. data/lib/core/facets/hash/merge.rb +4 -38
  55. data/lib/core/facets/hash/new.rb +5 -38
  56. data/lib/core/facets/hash/op.rb +20 -66
  57. data/lib/core/facets/hash/rekey.rb +9 -87
  58. data/lib/core/facets/hash/select.rb +1 -1
  59. data/lib/core/facets/hash/slice.rb +42 -0
  60. data/lib/core/facets/hash/traverse.rb +6 -46
  61. data/lib/core/facets/hash/update.rb +27 -67
  62. data/lib/core/facets/hash/weave.rb +22 -42
  63. data/lib/core/facets/indexable.rb +42 -14
  64. data/lib/core/facets/integer/bitmask.rb +69 -106
  65. data/lib/core/facets/integer/factorial.rb +1 -44
  66. data/lib/core/facets/integer/multiples.rb +27 -22
  67. data/lib/core/facets/integer/of.rb +1 -33
  68. data/lib/core/facets/kernel.rb +4 -2
  69. data/lib/core/facets/kernel/ask.rb +15 -3
  70. data/lib/core/facets/kernel/callstack.rb +38 -69
  71. data/lib/core/facets/kernel/constant.rb +2 -38
  72. data/lib/core/facets/kernel/deepcopy.rb +3 -55
  73. data/lib/core/facets/kernel/dir.rb +2 -0
  74. data/lib/core/facets/kernel/ergo.rb +2 -2
  75. data/lib/core/facets/kernel/instance.rb +51 -120
  76. data/lib/core/facets/kernel/metaid.rb +35 -73
  77. data/lib/core/facets/kernel/object.rb +14 -39
  78. data/lib/core/facets/kernel/op_esc.rb +24 -2
  79. data/lib/core/facets/kernel/populate.rb +6 -69
  80. data/lib/core/facets/kernel/report.rb +28 -33
  81. data/lib/core/facets/kernel/require.rb +7 -21
  82. data/lib/core/facets/kernel/respond.rb +11 -1
  83. data/lib/core/facets/kernel/returning.rb +50 -0
  84. data/lib/core/facets/kernel/silence.rb +12 -24
  85. data/lib/core/facets/kernel/super.rb +12 -76
  86. data/lib/core/facets/kernel/tap.rb +25 -107
  87. data/lib/core/facets/kernel/val.rb +7 -46
  88. data/lib/core/facets/kernel/withattr.rb +6 -64
  89. data/lib/core/facets/matchdata/matchset.rb +8 -50
  90. data/lib/core/facets/module.rb +3 -1
  91. data/lib/core/facets/module/abstract.rb +9 -47
  92. data/lib/core/facets/module/alias.rb +11 -68
  93. data/lib/core/facets/module/attr.rb +36 -15
  94. data/lib/core/facets/module/cattr.rb +8 -76
  95. data/lib/core/facets/module/clone.rb +15 -66
  96. data/lib/core/facets/module/include.rb +54 -114
  97. data/lib/core/facets/module/methods.rb +15 -13
  98. data/lib/core/facets/module/modify.rb +20 -206
  99. data/lib/core/facets/module/name.rb +19 -83
  100. data/lib/core/facets/module/require.rb +48 -53
  101. data/lib/core/facets/module/traits.rb +74 -33
  102. data/lib/core/facets/nilclass/status.rb +25 -2
  103. data/lib/core/facets/numeric/round.rb +24 -89
  104. data/lib/core/facets/proc/bind.rb +16 -59
  105. data/lib/core/facets/proc/compose.rb +6 -40
  106. data/lib/core/facets/proc/fn.rb +2 -0
  107. data/lib/core/facets/range/combine.rb +15 -51
  108. data/lib/core/facets/range/overlap.rb +8 -64
  109. data/lib/core/facets/regexp/arity.rb +6 -41
  110. data/lib/core/facets/stackable.rb +43 -4
  111. data/lib/core/facets/string.rb +2 -0
  112. data/lib/core/facets/string/align.rb +45 -55
  113. data/lib/core/facets/string/blank.rb +2 -46
  114. data/lib/core/facets/string/bracket.rb +14 -87
  115. data/lib/core/facets/string/case.rb +45 -32
  116. data/lib/core/facets/string/crypt.rb +3 -40
  117. data/lib/core/facets/string/filter.rb +7 -49
  118. data/lib/core/facets/string/format.rb +24 -126
  119. data/lib/core/facets/string/indexable.rb +50 -133
  120. data/lib/core/facets/string/interpolate.rb +24 -59
  121. data/lib/core/facets/string/natcmp.rb +5 -39
  122. data/lib/core/facets/string/nchar.rb +37 -45
  123. data/lib/core/facets/string/op.rb +13 -0
  124. data/lib/core/facets/string/partitions.rb +38 -99
  125. data/lib/core/facets/string/range.rb +8 -49
  126. data/lib/core/facets/string/regesc.rb +9 -42
  127. data/lib/core/facets/string/scan.rb +6 -52
  128. data/lib/core/facets/string/splice.rb +8 -13
  129. data/lib/core/facets/string/tabs.rb +16 -153
  130. data/lib/core/facets/symbol.rb +3 -1
  131. data/lib/core/facets/symbol/chomp.rb +11 -29
  132. data/lib/core/facets/symbol/generate.rb +4 -43
  133. data/lib/core/facets/symbol/not.rb +13 -25
  134. data/lib/core/facets/symbol/shadow.rb +2 -40
  135. data/lib/core/facets/symbol/succ.rb +14 -13
  136. data/lib/core/facets/symbol/to_proc.rb +33 -28
  137. data/lib/core/facets/time.rb +1 -0
  138. data/lib/core/facets/time/change.rb +5 -38
  139. data/lib/core/facets/time/elapse.rb +2 -41
  140. data/lib/core/facets/time/stamp.rb +47 -0
  141. data/lib/core/facets/unboundmethod.rb +3 -0
  142. data/lib/core/facets/unboundmethod/arguments.rb +27 -4
  143. data/lib/core/facets/unboundmethod/name.rb +21 -7
  144. data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
  145. data/lib/methods/facets/enumerable/collate.rb +1 -0
  146. data/lib/methods/facets/enumerable/divide.rb +1 -1
  147. data/lib/methods/facets/enumerable/each_by.rb +1 -1
  148. data/lib/methods/facets/enumerable/each_pair.rb +1 -1
  149. data/lib/methods/facets/enumerable/eachn.rb +1 -1
  150. data/lib/methods/facets/enumerable/graph.rb +1 -1
  151. data/lib/methods/facets/enumerable/group_by.rb +1 -1
  152. data/lib/methods/facets/enumerable/inject.rb +1 -0
  153. data/lib/methods/facets/enumerable/map_send.rb +1 -0
  154. data/lib/methods/facets/enumerable/modulate.rb +1 -0
  155. data/lib/methods/facets/enumerable/partition_by.rb +1 -1
  156. data/lib/methods/facets/hash/collate.rb +1 -1
  157. data/lib/methods/facets/hash/except.rb +1 -0
  158. data/lib/methods/facets/hash/graph.rb +1 -1
  159. data/lib/methods/facets/hash/mash.rb +1 -0
  160. data/lib/methods/facets/kernel/Bit.rb +1 -0
  161. data/lib/methods/facets/kernel/complete.rb +1 -1
  162. data/lib/methods/facets/kernel/here.rb +1 -1
  163. data/lib/methods/facets/kernel/non_nil.rb +1 -0
  164. data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
  165. data/lib/methods/facets/kernel/with.rb +1 -1
  166. data/lib/methods/facets/module/class_def.rb +1 -0
  167. data/lib/methods/facets/string/camelcase.rb +1 -0
  168. data/lib/methods/facets/string/op_minus.rb +1 -0
  169. data/lib/methods/facets/string/snakecase.rb +1 -0
  170. data/lib/more/facets/attributes.rb +5 -5
  171. data/lib/more/facets/basicobject.rb +0 -62
  172. data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
  173. data/lib/more/facets/duration.rb +534 -0
  174. data/lib/more/facets/lazy.rb +3 -3
  175. data/lib/more/facets/namespace.rb +23 -71
  176. data/lib/more/facets/rbsystem.rb +42 -8
  177. data/lib/more/facets/stylize.rb +6 -3
  178. data/lib/more/facets/thread.rb +55 -0
  179. data/meta/MANIFEST +49 -18
  180. data/meta/ROLLRC +1 -1
  181. data/meta/project.yaml +2 -2
  182. data/task/install +1 -1
  183. data/task/test/general +8 -2
  184. data/test/unit/array/test_pad.rb +30 -45
  185. data/test/unit/array/test_stackable.rb +14 -28
  186. data/test/unit/binding/test_cflow.rb +34 -49
  187. data/test/unit/binding/test_defined.rb +17 -0
  188. data/test/unit/binding/test_eval.rb +11 -39
  189. data/test/unit/binding/test_here.rb +17 -0
  190. data/test/unit/binding/test_self.rb +17 -0
  191. data/test/unit/binding/test_vars.rb +22 -37
  192. data/test/unit/class/test_descendents.rb +15 -30
  193. data/test/unit/class/test_initializer.rb +1 -8
  194. data/test/unit/comparable/test_bound.rb +38 -53
  195. data/test/unit/comparable/test_cmp.rb +45 -60
  196. data/test/unit/dir/test_traverse.rb +56 -0
  197. data/test/unit/enumerable/test_cartesian.rb +34 -47
  198. data/test/unit/enumerable/test_collect.rb +16 -125
  199. data/test/unit/enumerable/test_combination.rb +1 -8
  200. data/test/unit/enumerable/test_count.rb +51 -66
  201. data/test/unit/enumerable/test_each.rb +77 -0
  202. data/test/unit/enumerable/test_mash.rb +51 -0
  203. data/test/unit/enumerable/test_permutation.rb +1 -7
  204. data/test/unit/enumerable/test_probability.rb +42 -55
  205. data/test/unit/enumerable/test_split.rb +52 -0
  206. data/test/unit/exception/test_detail.rb +19 -0
  207. data/test/unit/file/test_read.rb +34 -0
  208. data/test/unit/file/test_topath.rb +17 -25
  209. data/test/unit/file/test_write.rb +6 -12
  210. data/test/unit/filetest/test_root.rb +14 -0
  211. data/test/unit/hash/test_at.rb +9 -21
  212. data/test/unit/hash/test_delete.rb +22 -37
  213. data/test/unit/hash/test_has_keys.rb +13 -28
  214. data/test/unit/hash/test_insert.rb +9 -23
  215. data/test/unit/hash/test_inverse.rb +11 -26
  216. data/test/unit/hash/test_iterate.rb +16 -31
  217. data/test/unit/hash/test_keyize.rb +40 -55
  218. data/test/unit/hash/test_merge.rb +10 -25
  219. data/test/unit/hash/test_new.rb +9 -24
  220. data/test/unit/hash/test_op.rb +1 -7
  221. data/test/unit/hash/test_rekey.rb +47 -62
  222. data/test/unit/hash/test_traverse.rb +17 -32
  223. data/test/unit/hash/test_update.rb +30 -45
  224. data/test/unit/hash/test_weave.rb +10 -23
  225. data/test/unit/integer/test_bitmask.rb +48 -44
  226. data/test/unit/integer/test_factorial.rb +11 -26
  227. data/test/unit/integer/test_multiples.rb +1 -5
  228. data/test/unit/integer/test_of.rb +14 -29
  229. data/test/unit/kernel/test_callstack.rb +13 -28
  230. data/test/unit/kernel/test_constant.rb +14 -28
  231. data/test/unit/kernel/test_deepcopy.rb +20 -35
  232. data/test/unit/kernel/test_instance.rb +46 -61
  233. data/test/unit/kernel/test_metaid.rb +42 -57
  234. data/test/unit/kernel/test_object.rb +14 -29
  235. data/test/unit/kernel/test_populate.rb +38 -53
  236. data/test/unit/kernel/test_report.rb +1 -7
  237. data/test/unit/kernel/test_returning.rb +16 -0
  238. data/test/unit/kernel/test_silence.rb +8 -23
  239. data/test/unit/kernel/test_super.rb +41 -56
  240. data/test/unit/kernel/test_tap.rb +15 -39
  241. data/test/unit/kernel/test_val.rb +7 -20
  242. data/test/unit/kernel/test_withattr.rb +29 -44
  243. data/test/unit/matchdata/test_matchset.rb +20 -35
  244. data/test/unit/module/test_abstract.rb +15 -30
  245. data/test/unit/module/test_alias.rb +32 -45
  246. data/test/unit/module/test_cattr.rb +39 -54
  247. data/test/unit/module/test_clone.rb +31 -43
  248. data/test/unit/module/test_include.rb +1 -35
  249. data/test/unit/module/test_modify.rb +102 -114
  250. data/test/unit/module/test_name.rb +1 -7
  251. data/test/unit/numeric/test_round.rb +46 -61
  252. data/test/unit/proc/test_bind.rb +29 -44
  253. data/test/unit/proc/test_compose.rb +20 -35
  254. data/test/unit/range/test_combine.rb +14 -29
  255. data/test/unit/range/test_overlap.rb +34 -51
  256. data/test/unit/regexp/test_arity.rb +14 -29
  257. data/test/unit/string/test_align.rb +13 -27
  258. data/test/unit/string/test_blank.rb +12 -27
  259. data/test/unit/string/test_bracket.rb +52 -67
  260. data/test/unit/string/test_case.rb +19 -38
  261. data/test/unit/string/test_crypt.rb +10 -25
  262. data/test/unit/string/test_filter.rb +1 -7
  263. data/test/unit/string/test_format.rb +2 -7
  264. data/test/unit/string/test_indexable.rb +54 -69
  265. data/test/unit/string/test_interpolate.rb +8 -21
  266. data/test/unit/string/test_natcmp.rb +11 -26
  267. data/test/unit/string/test_nchar.rb +1 -14
  268. data/test/unit/string/test_op.rb +14 -0
  269. data/test/unit/string/test_partitions.rb +39 -54
  270. data/test/unit/string/test_range.rb +17 -32
  271. data/test/unit/string/test_regesc.rb +1 -7
  272. data/test/unit/string/test_scan.rb +23 -38
  273. data/test/unit/string/test_stackable.rb +79 -98
  274. data/test/unit/string/test_tabs.rb +1 -7
  275. data/test/unit/symbol/test_chomp.rb +10 -21
  276. data/test/unit/symbol/test_generate.rb +7 -22
  277. data/test/unit/symbol/test_not.rb +10 -25
  278. data/test/unit/symbol/test_shadow.rb +8 -23
  279. data/test/unit/symbol/test_succ.rb +1 -7
  280. data/test/unit/symbol/test_to_proc.rb +1 -7
  281. data/test/unit/test_attributes.rb +1 -1
  282. data/test/unit/test_continuation.rb +13 -0
  283. data/test/unit/test_conversion.rb +1 -14
  284. data/test/unit/test_namespace.rb +30 -3
  285. data/test/unit/test_thread.rb +23 -0
  286. data/test/unit/time/test_change.rb +11 -26
  287. data/test/unit/time/test_elapse.rb +10 -25
  288. data/test/unit/time/test_stamp.rb +28 -0
  289. metadata +65 -25
  290. data/lib/core/facets/array/unzip.rb +0 -14
  291. data/lib/core/facets/continuation.rb +0 -1
  292. data/lib/core/facets/enumerable/collate.rb +0 -104
  293. data/lib/core/facets/kernel/require_esc.rb +0 -44
  294. data/lib/more/facets/mapsend.rb +0 -98
  295. data/lib/more/facets/pp_s.rb +0 -30
  296. data/log/history.rd +0 -38
  297. data/log/todo.rd +0 -4
  298. data/task/special/quickopts +0 -15
  299. data/test/unit/continuation/test_create.rb +0 -28
  300. data/test/unit/enumerable/test_collate.rb +0 -51
  301. data/test/unit/kernel/test_require_esc.rb +0 -29
  302. data/test/unit/test_mapsend.rb +0 -18
  303. data/test/unit/test_pp_s.rb +0 -17
@@ -1,7 +1,3 @@
1
- # LOG:
2
- # - 2007.11.01 Trans
3
- # Deprecated #each_uniq_pair, just use #each_combination instead.
4
-
5
1
  require 'facets/integer/factorial'
6
2
 
7
3
  module Enumerable
@@ -27,7 +23,7 @@ module Enumerable
27
23
  # ["b", "x", "x"]
28
24
  # ["b", "x", "y"]
29
25
  #
30
- # CREDIT Florian Gross
26
+ # CREDIT: Florian Gross
31
27
 
32
28
  def self.combinations(head, *rest)
33
29
  crest = rest.empty? ? [[]] : combinations(*rest)
@@ -50,7 +46,7 @@ module Enumerable
50
46
  # ["a", "c", "d"]
51
47
  # ["b", "c", "d"]
52
48
  #
53
- # CREDIT Florian Gross
49
+ # CREDIT: Florian Gross
54
50
 
55
51
  def each_combination(k=2)
56
52
  s = to_a
@@ -67,42 +63,44 @@ module Enumerable
67
63
  end
68
64
  end
69
65
 
70
- # # Processes each unique pair (of indices, not value)
71
- # # in the array by yielding them to the supplied block.
72
- # #
73
- # # a = [1,2,3,4]
74
- # # a.each_unique_pair{ |a,b| puts a+','+b }
75
- # #
76
- # # produces
77
- # #
78
- # # 1,2
79
- # # 1,3
80
- # # 1,4
81
- # # 2,3
82
- # # 2,4
83
- # # 3,4
84
- # #
85
- # # This does not guarantee the uniqueness of values.
86
- # # For example:
87
- # #
88
- # # a = [1,2,1]
89
- # # a.each_unique_pair{ |a,b| puts a+','+b }
90
- # #
91
- # # prduces
92
- # #
93
- # # 1,2
94
- # # 1,1
95
- # # 2,1
96
- # #
97
- # # This is equivalent to <tt>each_combination(2){ ... }</tt>.
98
- #
99
- # def each_unique_pair(&yld)
100
- # self.each_combination(2,&yld)
101
- # #s = self.to_a
102
- # #self.each_with_index{ |a,i|
103
- # # self[(i+1)..-1].each{ |b| yield a,b }
104
- # #}
105
- # end
66
+ # NOTE: Deprecated #each_uniq_pair, just use #each_combination instead.
67
+ #
68
+ # # Processes each unique pair (of indices, not value)
69
+ # # in the array by yielding them to the supplied block.
70
+ # #
71
+ # # a = [1,2,3,4]
72
+ # # a.each_unique_pair{ |a,b| puts a+','+b }
73
+ # #
74
+ # # produces
75
+ # #
76
+ # # 1,2
77
+ # # 1,3
78
+ # # 1,4
79
+ # # 2,3
80
+ # # 2,4
81
+ # # 3,4
82
+ # #
83
+ # # This does not guarantee the uniqueness of values.
84
+ # # For example:
85
+ # #
86
+ # # a = [1,2,1]
87
+ # # a.each_unique_pair{ |a,b| puts a+','+b }
88
+ # #
89
+ # # prduces
90
+ # #
91
+ # # 1,2
92
+ # # 1,1
93
+ # # 2,1
94
+ # #
95
+ # # This is equivalent to <tt>each_combination(2){ ... }</tt>.
96
+ #
97
+ # def each_unique_pair(&yld)
98
+ # self.each_combination(2,&yld)
99
+ # #s = self.to_a
100
+ # #self.each_with_index{ |a,i|
101
+ # # self[(i+1)..-1].each{ |b| yield a,b }
102
+ # #}
103
+ # end
106
104
 
107
105
  end
108
106
 
@@ -1,35 +1,80 @@
1
- # TITLE:
2
- #
3
- # Enumerable Counting
4
- #
5
- # SUMMARY:
6
- #
7
- # Extensions related to counting and uniquness.
8
- #
9
- # AUTHORS:
10
- #
11
- # - Florian Gross
12
- # - Thomas Sawyer
13
- # - Gavin Sinclair
14
- # - Gavin Kistner
15
-
16
- #
17
1
  module Enumerable
18
2
 
19
- # Count the number of items in an enumerable
20
- # equal (==) to the given object.
21
- #
22
- # e = [ 'a', '1', 'a' ]
23
- # e.count('1') #=> 1
24
- # e.count('a') #=> 2
25
- #
26
- # Count can also handle multiple-valued blocks.
27
- #
28
- # e = { 'a' => 2, 'a' => 2, 'b' => 1 }
29
- # e.count('a',2) #=> 1
30
- #
31
- def count(*c)
32
- self.select{ |*i| i == c }.length
3
+ unless (RUBY_VERSION[0,3] == '1.9')
4
+
5
+ # Count the number of items in an enumerable
6
+ # equal (==) to the given object.
7
+ #
8
+ # e = [ 'a', '1', 'a' ]
9
+ # e.count('1') #=> 1
10
+ # e.count('a') #=> 2
11
+ #
12
+ # Count can also handle multiple-valued blocks.
13
+ #
14
+ # e = { 'a' => 2, 'a' => 2, 'b' => 1 }
15
+ # e.count('a',2) #=> 1
16
+ #
17
+ # CREDIT: Trans
18
+
19
+ def count(*c)
20
+ self.select{ |*i| i == c }.length
21
+ end
22
+
23
+ # Enumerable#one? returns +true+ if and only if <em>exactly one</em>
24
+ # element in the collection satisfies the given predicate.
25
+ #
26
+ # If no predicate is provided, Enumerable#one? returns +true+ if
27
+ # and only if <em>exactly one</em> element has a true value
28
+ # (i.e. not +nil+ or +false+).
29
+ #
30
+ # [].one? # false
31
+ # [nil].one? # false
32
+ # [5].one? # true
33
+ # [5,8,9].one? # false
34
+ # (1...10).one? { |n| n == 5 } # true
35
+ # (1...10).one? { |n| n < 5 } # false
36
+ #
37
+ # CREDIT: Gavin Sinclair
38
+
39
+ def one? # :yield: e
40
+ matches = 0
41
+ if block_given?
42
+ self.each do |e|
43
+ if yield(e)
44
+ matches += 1
45
+ return false if matches > 1
46
+ end
47
+ end
48
+ return (matches == 1)
49
+ else
50
+ one? { |e| e }
51
+ end
52
+ end
53
+
54
+ # Enumerable#none? is the logical opposite of the builtin method
55
+ # Enumerable#any?. It returns +true+ if and only if _none_ of
56
+ # the elements in the collection satisfy the predicate.
57
+ #
58
+ # If no predicate is provided, Enumerable#none? returns +true+
59
+ # if and only if _none_ of the elements have a true value
60
+ # (i.e. not +nil+ or +false+).
61
+ #
62
+ # [].none? # true
63
+ # [nil].none? # true
64
+ # [5,8,9].none? # false
65
+ # (1...10).none? { |n| n < 0 } # true
66
+ # (1...10).none? { |n| n > 0 } # false
67
+ #
68
+ # CREDIT: Gavin Sinclair
69
+
70
+ def none? # :yield: e
71
+ if block_given?
72
+ not self.any? { |e| yield e }
73
+ else
74
+ not self.any?
75
+ end
76
+ end
77
+
33
78
  end
34
79
 
35
80
  # Returns an array of elements for the elements that occur n times.
@@ -45,6 +90,8 @@ module Enumerable
45
90
  # [1,1,2,3,3,4,5,5].occur { |n| n == 1 } #=> [2,4]
46
91
  # [1,1,2,3,3,4,5,5].occur { |n| n > 1 } #=> [1,3,5]
47
92
  #
93
+ # CREDIT: ?
94
+
48
95
  def occur(n=nil) #:yield:
49
96
  result = Hash.new { |hash, key| hash[key] = Array.new }
50
97
  self.each do |item|
@@ -64,12 +111,12 @@ module Enumerable
64
111
  return result.values.flatten.uniq
65
112
  end
66
113
 
67
- # CREDIT Gavin Kistner
68
-
69
114
  # Uses #+ to sum the enumerated elements.
70
115
  #
71
116
  # [1,2,3].sum #=> 6
72
117
  # [3,3,3].sum #=> 9
118
+ #
119
+ # CREDIT: Gavin Kistner
73
120
 
74
121
  def sum
75
122
  v = 0
@@ -77,9 +124,12 @@ module Enumerable
77
124
  v
78
125
  end
79
126
 
80
- # CREDIT Martin DeMello
81
-
127
+ # Returns a list on non-unique,
128
+ #
129
+ # [1,1,2,2,3,4,5].nonuniq #=> [1,2]
82
130
  #
131
+ # CREDIT: Martin DeMello
132
+
83
133
  def nonuniq
84
134
  h1 = {}
85
135
  h2 = {}
@@ -90,19 +140,21 @@ module Enumerable
90
140
  h2.keys
91
141
  end
92
142
 
93
- # #
94
- # def nonuniq!
95
- # raise unless respond_to?(:replace)
96
- # h1 = {}
97
- # h2 = {}
98
- # each {|i|
99
- # h2[i] = true if h1[i]
100
- # h1[i] = true
101
- # }
102
- # self.replace(h2.keys)
103
- # end
143
+ # #
144
+ # def nonuniq!
145
+ # raise unless respond_to?(:replace)
146
+ # h1 = {}
147
+ # h2 = {}
148
+ # each {|i|
149
+ # h2[i] = true if h1[i]
150
+ # h1[i] = true
151
+ # }
152
+ # self.replace(h2.keys)
153
+ # end
104
154
 
105
155
  # Return list of dulicate elements.
156
+ #
157
+ # CREDIT: Thibaut Barrère
106
158
 
107
159
  alias_method :duplicates, :nonuniq
108
160
 
@@ -114,137 +166,10 @@ module Enumerable
114
166
  #
115
167
  # [-5, -4, -3, -2, -1, 0]
116
168
  #
169
+ # CREDIT: ?
170
+
117
171
  def uniq_by #:yield:
118
172
  h = {}; inject([]) {|a,x| h[yield(x)] ||= a << x}
119
173
  end
120
174
 
121
- # Enumerable#one? returns +true+ if and only if <em>exactly one</em>
122
- # element in the collection satisfies the given predicate.
123
- #
124
- # If no predicate is provided, Enumerable#one? returns +true+ if
125
- # and only if <em>exactly one</em> element has a true value
126
- # (i.e. not +nil+ or +false+).
127
- #
128
- # [].one? # false
129
- # [nil].one? # false
130
- # [5].one? # true
131
- # [5,8,9].one? # false
132
- # (1...10).one? { |n| n == 5 } # true
133
- # (1...10).one? { |n| n < 5 } # false
134
- #
135
- #--
136
- # Credit goes to Gavin Sinclair.
137
- #++
138
- def one? # :yield: e
139
- matches = 0
140
- if block_given?
141
- self.each do |e|
142
- if yield(e)
143
- matches += 1
144
- return false if matches > 1
145
- end
146
- end
147
- return (matches == 1)
148
- else
149
- one? { |e| e }
150
- end
151
- end
152
-
153
- # Enumerable#none? is the logical opposite of the builtin method
154
- # Enumerable#any?. It returns +true+ if and only if _none_ of
155
- # the elements in the collection satisfy the predicate.
156
- #
157
- # If no predicate is provided, Enumerable#none? returns +true+
158
- # if and only if _none_ of the elements have a true value
159
- # (i.e. not +nil+ or +false+).
160
- #
161
- # [].none? # true
162
- # [nil].none? # true
163
- # [5,8,9].none? # false
164
- # (1...10).none? { |n| n < 0 } # true
165
- # (1...10).none? { |n| n > 0 } # false
166
- #
167
- #--
168
- # Credit goes to Gavin Sinclair.
169
- #++
170
- def none? # :yield: e
171
- if block_given?
172
- not self.any? { |e| yield e }
173
- else
174
- not self.any?
175
- end
176
- end
177
-
178
175
  end
179
-
180
-
181
-
182
- # _____ _
183
- # |_ _|__ ___| |_
184
- # | |/ _ \/ __| __|
185
- # | | __/\__ \ |_
186
- # |_|\___||___/\__|
187
- #
188
- =begin test
189
-
190
- require 'test/unit'
191
-
192
- class TestEnumerableCount < Test::Unit::TestCase
193
-
194
- def test_occur
195
- arr = [:a,:b,:a]
196
- assert_equal( [:b], arr.occur(1) )
197
- assert_equal( [:a], arr.occur(2) )
198
- assert_equal( [:b], arr.occur(1..1) )
199
- assert_equal( [:a], arr.occur{ |n| n % 2 == 0 } )
200
- end
201
-
202
- def test_count_01
203
- e = [ 'a', '1', 'a' ]
204
- assert_equal( 1, e.count('1') )
205
- assert_equal( 2, e.count('a') )
206
- end
207
-
208
- def test_count_02
209
- e = [ ['a',2], ['a',2], ['a',2], ['b',1] ]
210
- assert_equal( 3, e.count(['a',2]) )
211
- end
212
-
213
- def test_count_03
214
- e = { 'a' => 2, 'a' => 2, 'b' => 1 }
215
- assert_equal( 1, e.count('a',2) )
216
- end
217
-
218
- def test_uniq_by
219
- a = [-5, -4, -3, -2, -1, 0]
220
- r = (-5..5).to_a.uniq_by{|i| i*i }
221
- assert_equal( a, r )
222
- end
223
-
224
- def test_one?
225
- a = [nil, true]
226
- assert( a.one? )
227
- a = [true, false]
228
- assert( a.one? )
229
- a = [true, true]
230
- assert( ! a.one? )
231
- a = [true, 1]
232
- assert( ! a.one? )
233
- a = [1, 1]
234
- assert( ! a.one? )
235
- end
236
-
237
- def test_none?
238
- a = [nil, nil]
239
- assert( a.none? )
240
- a = [false, false]
241
- assert( a.none? )
242
- a = [true, false]
243
- assert( ! a.none? )
244
- a = [nil, 1]
245
- assert( ! a.none? )
246
- end
247
-
248
- end
249
-
250
- =end
@@ -0,0 +1,86 @@
1
+ # TODO:
2
+ #
3
+ # - Remove require 'enumerator' for Ruby 1.9.
4
+ # - Suggest Enumerator's #each_slice use block arity if no parameter is given.
5
+
6
+ require 'enumerator' # for each_slice
7
+
8
+ module Enumerable
9
+
10
+ # Iterate through slices. If slicing +step+ is not
11
+ # given, the the arity if the block is used.
12
+ #
13
+ # x = []
14
+ # [1,2,3,4].each_by{ |a,b| x << [a,b] }
15
+ # x #=> [ [1,2], [3,4] ]
16
+ #
17
+ # x = []
18
+ # [1,2,3,4,5,6].each_by(3){ |a| x << a }
19
+ # x #=> [ [1,2,3], [4,5,6] ]
20
+ #
21
+ # CREDIT: Trans
22
+
23
+ def each_by(step=nil, &yld)
24
+ if step
25
+ each_slice(step,&yld)
26
+ else
27
+ step = yld.arity.abs
28
+ each_slice(step,&yld)
29
+ end
30
+ end
31
+
32
+ # Iterators over each element pairing.
33
+ #
34
+ # [:a,:b,:c,:d].each_pair { |a,b| puts "#{a} -> #{b}" }
35
+ #
36
+ # _produces_
37
+ #
38
+ # a -> b
39
+ # c -> d
40
+ #
41
+ # CREDIT: Martin DeMello
42
+
43
+ def each_pair #:yield:
44
+ e1 = nil
45
+ each_with_index do |e,i|
46
+ if i % 2 == 0
47
+ e1 = e
48
+ next
49
+ else
50
+ yield(e1,e)
51
+ end
52
+ end
53
+ end
54
+
55
+ # Collect each n items based on arity.
56
+ #
57
+ # [1,2,3,4].eachn do |x, y|
58
+ # [x,y]
59
+ # end
60
+ #
61
+ # _produces_
62
+ #
63
+ # [1,2]
64
+ # [3,4]
65
+ #
66
+ # CREDIT: Martin DeMello
67
+
68
+ def eachn(&block)
69
+ n = block.arity.abs
70
+ each_slice(n) {|i| block.call(*i)}
71
+ end
72
+
73
+
74
+ # DEPRECATED
75
+ #
76
+ # # Why the term counter? There may be a change in Ruby 2.0
77
+ # # to use this word instead of index. Index will
78
+ # # still be used for Array, since that is the proper meaning
79
+ # # in that context. In the mean time, aliases are provided.
80
+ #
81
+ # # More appropriate naming since an enumerable is not
82
+ # # neccesarily "indexed", as is an Array or Hash.
83
+ # alias_method :each_with_counter, :each_with_index
84
+
85
+ end
86
+