facets 2.1.3 → 2.2.0

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.
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
+