facets 3.0.0 → 3.1.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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/.index +11 -7
  3. data/CONTRIBUTING.md +112 -0
  4. data/HISTORY.md +38 -0
  5. data/{README.rdoc → README.md} +59 -59
  6. data/demo/core/array/after.md +13 -0
  7. data/demo/core/array/arrange.md +17 -0
  8. data/demo/core/array/before.md +14 -0
  9. data/demo/core/array/collapse.md +15 -0
  10. data/demo/core/array/collisions.md +30 -0
  11. data/demo/core/array/commonality.md +31 -0
  12. data/demo/core/array/conjoin.md +47 -0
  13. data/demo/core/array/contains.md +9 -0
  14. data/demo/core/array/delete_unless.md +13 -0
  15. data/demo/core/array/delete_values.md +10 -0
  16. data/demo/core/array/delete_values_at.md +15 -0
  17. data/demo/core/array/divide.md +14 -0
  18. data/demo/core/array/duplicates.md +14 -0
  19. data/demo/core/array/each_overlap.md +12 -0
  20. data/demo/core/array/each_pair.md +13 -0
  21. data/demo/core/array/each_value.md +12 -0
  22. data/demo/core/array/entropy.md +13 -0
  23. data/demo/core/array/extract_options.md +13 -0
  24. data/demo/core/array/first.md +11 -0
  25. data/demo/core/array/from.md +11 -0
  26. data/demo/core/array/ideal_entropy.md +11 -0
  27. data/demo/core/array/intersection.md +11 -0
  28. data/demo/core/array/last.md +11 -0
  29. data/demo/core/array/median.md +23 -0
  30. data/demo/core/array/merge.md +15 -0
  31. data/demo/core/array/missing.md +10 -0
  32. data/demo/core/array/mode.md +9 -0
  33. data/demo/core/array/nonuniq.md +16 -0
  34. data/demo/core/array/not_empty.md +8 -0
  35. data/demo/core/array/occur.md +18 -0
  36. data/demo/core/array/occurrence.md +13 -0
  37. data/demo/core/array/only.md +9 -0
  38. data/demo/core/array/op_pow.md +10 -0
  39. data/demo/core/array/pad.md +28 -0
  40. data/demo/core/array/peek.md +10 -0
  41. data/demo/core/array/poke.md +15 -0
  42. data/demo/core/array/probability +8 -0
  43. data/demo/core/array/pull.md +10 -0
  44. data/demo/core/array/recurse.md +10 -0
  45. data/demo/core/array/recursively.md +20 -0
  46. data/demo/core/array/reject_values.md +10 -0
  47. data/demo/core/array/splice.md +14 -0
  48. data/demo/core/array/split.md +13 -0
  49. data/demo/core/array/squeeze.md +14 -0
  50. data/demo/core/array/step.md +16 -0
  51. data/demo/core/array/store.md +9 -0
  52. data/demo/core/array/thru.md +12 -0
  53. data/demo/core/array/to_h.md +11 -0
  54. data/demo/core/array/traverse.md +20 -0
  55. data/demo/core/array/uniq_by.md +16 -0
  56. data/demo/core/array/unique_permutation.md +14 -0
  57. data/demo/core/array/zip.md +8 -0
  58. data/demo/core/binding/caller.md +57 -0
  59. data/demo/core/binding/defined.md +10 -0
  60. data/demo/core/binding/opvars.md +16 -0
  61. data/demo/core/binding/self.md +6 -0
  62. data/demo/core/class/descendants.md +13 -0
  63. data/demo/core/class/to_proc.md +11 -0
  64. data/demo/core/comparable/at_least.md +11 -0
  65. data/demo/core/comparable/at_most.md +11 -0
  66. data/demo/core/comparable/bound.md +13 -0
  67. data/demo/core/comparable/cap.md +11 -0
  68. data/demo/core/comparable/clip.md +29 -0
  69. data/demo/core/comparable/cmp.md +18 -0
  70. data/demo/core/comparable/op_get.md +32 -0
  71. data/demo/core/dir/ascend.md +24 -0
  72. data/demo/core/dir/descend.md +16 -0
  73. data/demo/core/dir/multiglob.md +41 -0
  74. data/demo/core/dir/parent.md +6 -0
  75. data/demo/core/dir/recurse.md +41 -0
  76. data/demo/core/exception/detail.md +19 -0
  77. data/demo/core/{facets.rdoc → facets.md} +1 -1
  78. data/demo/core/filetest/root.md +13 -0
  79. data/demo/core/hash/recursively.md +21 -0
  80. data/demo/core/indexable.md +95 -0
  81. data/demo/core/integer/bitmask.md +46 -0
  82. data/demo/core/integer/{factorial.rdoc → factorial.md} +1 -1
  83. data/demo/core/integer/{length.rdoc → length.md} +1 -1
  84. data/demo/core/integer/{multiple.rdoc → multiple.md} +3 -1
  85. data/demo/core/integer/of.md +11 -0
  86. data/demo/core/integer/{ordinal.rdoc → ordinal.md} +3 -1
  87. data/demo/core/integer/{of.rdoc → times_collect.md} +2 -7
  88. data/demo/core/matchdata/match.md +7 -0
  89. data/demo/core/matchdata/matchset.md +7 -0
  90. data/demo/core/matchdata/matchtree.md +10 -0
  91. data/demo/core/module/cattr.md +43 -0
  92. data/demo/core/module/class_extend.md +64 -0
  93. data/demo/core/module/{class_inheritor.rdoc → class_inheritor.md} +2 -2
  94. data/demo/core/module/{copy_inheritor.rdoc → copy_inheritor.md} +4 -4
  95. data/demo/core/module/include_as.md +31 -0
  96. data/demo/core/module/method_space.md +24 -0
  97. data/demo/core/string/acronym.md +9 -0
  98. data/demo/core/string/{align.rdoc → align.md} +10 -10
  99. data/demo/core/string/ascii_only.md +37 -0
  100. data/demo/core/string/{bracket.rdoc → bracket.md} +10 -10
  101. data/demo/core/string/camelcase.md +47 -0
  102. data/demo/core/string/{capitalized.rdoc → capitalized.md} +9 -9
  103. data/demo/core/string/characters.md +11 -0
  104. data/demo/core/string/{cleanlines.rdoc → cleanlines.md} +3 -3
  105. data/demo/core/string/cleave.md +49 -0
  106. data/demo/core/string/compress_lines.md +22 -0
  107. data/demo/core/string/crypt.md +15 -0
  108. data/demo/core/string/divide.md +9 -0
  109. data/demo/core/string/each_word.md +11 -0
  110. data/demo/core/string/edit_distance.md +15 -0
  111. data/demo/core/string/exclude.md +15 -0
  112. data/demo/core/string/expand_tabs.md +69 -0
  113. data/demo/core/string/fold.md +14 -0
  114. data/demo/core/string/indent.md +65 -0
  115. data/demo/core/string/index_all.md +14 -0
  116. data/demo/core/string/interpolate.md +8 -0
  117. data/demo/core/string/lchomp.md +14 -0
  118. data/demo/core/string/line_wrap.md +7 -0
  119. data/demo/core/string/lowercase.md +12 -0
  120. data/demo/core/string/methodize.md +22 -0
  121. data/demo/core/string/modulize.md +22 -0
  122. data/demo/core/string/mscan.md +10 -0
  123. data/demo/core/string/natcmp.md +10 -0
  124. data/demo/core/string/nchar.md +9 -0
  125. data/demo/core/string/{newlines.rdoc → newlines.md} +3 -3
  126. data/demo/core/string/number.md +27 -0
  127. data/demo/core/string/op_div.md +10 -0
  128. data/demo/core/string/op_sub.md +7 -0
  129. data/demo/core/string/pathize.md +22 -0
  130. data/demo/core/string/quote.md +20 -0
  131. data/demo/core/string/random.md +25 -0
  132. data/demo/core/string/range.md +19 -0
  133. data/demo/core/string/remove.md +33 -0
  134. data/demo/core/string/rewrite.md +9 -0
  135. data/demo/core/string/shatter.md +9 -0
  136. data/demo/core/string/similarity.md +12 -0
  137. data/demo/core/string/snakecase.md +14 -0
  138. data/demo/core/string/splice.md +28 -0
  139. data/demo/core/string/squish.md +27 -0
  140. data/demo/core/string/store.md +10 -0
  141. data/demo/core/string/subtract.md +8 -0
  142. data/demo/core/string/titlecase.md +8 -0
  143. data/demo/core/string/to_re.md +22 -0
  144. data/demo/core/string/{margin.rdoc → trim.md} +14 -14
  145. data/demo/core/string/unbracket.md +24 -0
  146. data/demo/core/string/underscore.md +17 -0
  147. data/demo/core/string/unfold.md +9 -0
  148. data/demo/core/string/unindent.md +65 -0
  149. data/demo/core/string/unquote.md +6 -0
  150. data/demo/core/string/uppercase.md +15 -0
  151. data/demo/core/string/variablize.md +7 -0
  152. data/demo/core/string/word_wrap.md +54 -0
  153. data/demo/core/string/words.md +13 -0
  154. data/demo/core/string/xor.md +8 -0
  155. data/lib/core/facets.yml +11 -7
  156. data/lib/core/facets/array.rb +1 -0
  157. data/lib/core/facets/array/average.rb +16 -0
  158. data/lib/core/facets/array/collapse.rb +4 -0
  159. data/lib/core/facets/array/delete_values_at.rb +1 -0
  160. data/lib/core/facets/array/divide.rb +7 -0
  161. data/lib/core/facets/array/duplicates.rb +2 -0
  162. data/lib/core/facets/array/each_pair.rb +1 -4
  163. data/lib/core/facets/array/first.rb +1 -0
  164. data/lib/core/facets/array/from.rb +11 -16
  165. data/lib/core/facets/array/intersection.rb +1 -1
  166. data/lib/core/facets/array/last.rb +1 -0
  167. data/lib/core/facets/array/mode.rb +2 -2
  168. data/lib/core/facets/array/occurrence.rb +4 -3
  169. data/lib/core/facets/array/op_pow.rb +0 -2
  170. data/lib/core/facets/array/probability.rb +1 -1
  171. data/lib/core/facets/array/recursively.rb +2 -2
  172. data/lib/core/facets/array/splice.rb +1 -1
  173. data/lib/core/facets/array/standard_deviation.rb +23 -0
  174. data/lib/core/facets/array/to_h.rb +0 -3
  175. data/lib/core/facets/array/uniq_by.rb +4 -0
  176. data/lib/core/facets/array/variance.rb +20 -0
  177. data/lib/core/facets/binding.rb +0 -1
  178. data/lib/core/facets/enumerable/cluster.rb +6 -4
  179. data/lib/core/facets/enumerable/hashify.rb +27 -31
  180. data/lib/core/facets/enumerable/sum.rb +12 -2
  181. data/lib/core/facets/file/atomic_open.rb +1 -1
  182. data/lib/core/facets/hash/except.rb +13 -1
  183. data/lib/core/facets/indexable.rb +1 -1
  184. data/lib/core/facets/kernel/ergo.rb +3 -3
  185. data/lib/core/facets/kernel/like.rb +1 -1
  186. data/lib/core/facets/matchdata/matchtree.rb +2 -0
  187. data/lib/core/facets/numeric/delimit.rb +20 -0
  188. data/lib/core/facets/range/nudge.rb +29 -0
  189. data/lib/core/facets/string.rb +0 -2
  190. data/lib/core/facets/string/indent.rb +0 -8
  191. data/lib/core/facets/string/margin.rb +0 -4
  192. data/lib/core/facets/string/random.rb +13 -3
  193. data/lib/core/facets/string/similarity.rb +7 -6
  194. data/lib/standard/facets/enumargs.rb +5 -0
  195. data/lib/standard/facets/math/percentile.rb +1 -1
  196. data/lib/standard/facets/net/http.rb +33 -14
  197. data/lib/standard/facets/timer.rb +3 -3
  198. data/test/core/array/test_average.rb +16 -0
  199. data/test/core/array/test_before.rb +21 -0
  200. data/test/core/array/test_collapse.rb +10 -1
  201. data/test/core/array/test_delete_unless.rb +17 -0
  202. data/test/core/array/test_delete_values.rb +31 -0
  203. data/test/core/array/test_divide.rb +10 -0
  204. data/test/core/array/test_each_pair.rb +16 -0
  205. data/test/core/array/test_each_value.rb +16 -0
  206. data/test/core/array/test_from.rb +42 -0
  207. data/test/core/array/test_op_pow.rb +13 -0
  208. data/test/core/array/test_standard_deviation.rb +18 -0
  209. data/test/core/array/test_to_h.rb +14 -0
  210. data/test/core/array/test_uniq_by.rb +7 -0
  211. data/test/core/array/test_variance.rb +17 -0
  212. data/test/core/array/test_zip.rb +13 -0
  213. data/test/core/dir/test_each_child.rb +1 -1
  214. data/test/core/dir/test_multiglob.rb +1 -1
  215. data/test/core/enumerable/test_cluster.rb +36 -0
  216. data/test/core/enumerable/test_hashify.rb +113 -0
  217. data/test/core/hash/test_expect.rb +11 -1
  218. data/test/core/kernel/test_ergo.rb +7 -5
  219. data/test/core/{object/test_replace.rb → kernel/test_instance_replace.rb} +6 -28
  220. data/test/core/numeric/test_delimit.rb +68 -0
  221. data/test/core/numeric/{test_round.rb → test_round_to.rb} +27 -27
  222. data/test/core/range/test_nudge.rb +32 -0
  223. data/test/core/range/{test_to_r.rb → test_to_rng.rb} +3 -3
  224. data/test/core/string/test_acronym.rb +14 -0
  225. data/test/core/string/test_ascii_only.rb +21 -0
  226. data/test/core/string/test_compress_lines.rb +9 -0
  227. data/test/core/string/test_crypt.rb +17 -0
  228. data/test/core/string/test_index_all.rb +4 -0
  229. data/test/core/string/test_random.rb +25 -0
  230. data/test/core/string/test_remove.rb +14 -0
  231. data/test/core/string/test_similarity.rb +9 -1
  232. data/test/core/struct/test_replace.rb +18 -0
  233. data/test/standard/test_enumargs.rb +26 -10
  234. data/test/standard/test_timer.rb +1 -1
  235. metadata +634 -588
  236. data/CONTRIBUTE.md +0 -78
  237. data/demo/core/array/combination.rdoc +0 -19
  238. data/demo/core/array/delete.rdoc +0 -23
  239. data/demo/core/array/index.rdoc +0 -14
  240. data/demo/core/array/merge.rdoc +0 -15
  241. data/demo/core/array/only.rdoc +0 -9
  242. data/demo/core/array/pad.rdoc +0 -28
  243. data/demo/core/array/permutation.rdoc +0 -10
  244. data/demo/core/array/product.rdoc +0 -26
  245. data/demo/core/array/recursively.rdoc +0 -16
  246. data/demo/core/array/rotate.rdoc +0 -30
  247. data/demo/core/array/select.rdoc +0 -8
  248. data/demo/core/array/uniq_by.rdoc +0 -9
  249. data/demo/core/binding/caller.rdoc +0 -57
  250. data/demo/core/binding/defined.rdoc +0 -10
  251. data/demo/core/binding/eval.rdoc +0 -8
  252. data/demo/core/binding/local_variables.rdoc +0 -26
  253. data/demo/core/binding/opvars.rdoc +0 -16
  254. data/demo/core/binding/self.rdoc +0 -6
  255. data/demo/core/class/descendants.rdoc +0 -10
  256. data/demo/core/class/to_proc.rdoc +0 -8
  257. data/demo/core/comparable/cap.rdoc +0 -20
  258. data/demo/core/comparable/clip.rdoc +0 -37
  259. data/demo/core/comparable/cmp.rdoc +0 -18
  260. data/demo/core/comparable/op_get.rdoc +0 -29
  261. data/demo/core/dir/ascend.rdoc +0 -24
  262. data/demo/core/dir/descend.rdoc +0 -14
  263. data/demo/core/dir/multiglob.rdoc +0 -41
  264. data/demo/core/dir/parent.rdoc +0 -6
  265. data/demo/core/dir/recurse.rdoc +0 -41
  266. data/demo/core/exception/detail.rdoc +0 -12
  267. data/demo/core/filetest/root.rdoc +0 -6
  268. data/demo/core/hash/recursively.rdoc +0 -21
  269. data/demo/core/indexable.rdoc +0 -95
  270. data/demo/core/integer/bitmask.rdoc +0 -46
  271. data/demo/core/integer/even.rdoc +0 -12
  272. data/demo/core/integer/odd.rdoc +0 -12
  273. data/demo/core/matchdata/match.rdoc +0 -7
  274. data/demo/core/matchdata/matchset.rdoc +0 -15
  275. data/demo/core/module/cattr.rdoc +0 -43
  276. data/demo/core/module/class_extend.rdoc +0 -64
  277. data/demo/core/module/method_space.rdoc +0 -55
  278. data/demo/core/string/bytes.rdoc +0 -8
  279. data/demo/core/string/camelcase.rdoc +0 -47
  280. data/demo/core/string/characters.rdoc +0 -11
  281. data/demo/core/string/cleave.rdoc +0 -49
  282. data/demo/core/string/divide.rdoc +0 -9
  283. data/demo/core/string/each_char.rdoc +0 -9
  284. data/demo/core/string/each_word.rdoc +0 -9
  285. data/demo/core/string/end_with.rdoc +0 -6
  286. data/demo/core/string/expand_tabs.rdoc +0 -69
  287. data/demo/core/string/fold.rdoc +0 -14
  288. data/demo/core/string/indent.rdoc +0 -65
  289. data/demo/core/string/interpolate.rdoc +0 -7
  290. data/demo/core/string/lchomp.rdoc +0 -14
  291. data/demo/core/string/line_wrap.rdoc +0 -7
  292. data/demo/core/string/lines.rdoc +0 -8
  293. data/demo/core/string/methodize.rdoc +0 -22
  294. data/demo/core/string/modulize.rdoc +0 -22
  295. data/demo/core/string/mscan.rdoc +0 -10
  296. data/demo/core/string/natcmp.rdoc +0 -10
  297. data/demo/core/string/nchar.rdoc +0 -9
  298. data/demo/core/string/op_sub.rdoc +0 -7
  299. data/demo/core/string/pathize.rdoc +0 -22
  300. data/demo/core/string/quote.rdoc +0 -20
  301. data/demo/core/string/range.rdoc +0 -19
  302. data/demo/core/string/rewrite.rdoc +0 -9
  303. data/demo/core/string/shatter.rdoc +0 -9
  304. data/demo/core/string/snakecase.rdoc +0 -10
  305. data/demo/core/string/splice.rdoc +0 -28
  306. data/demo/core/string/start_with.rdoc +0 -7
  307. data/demo/core/string/subtract.rdoc +0 -8
  308. data/demo/core/string/tab.rdoc +0 -16
  309. data/demo/core/string/tabto.rdoc +0 -29
  310. data/demo/core/string/titlecase.rdoc +0 -8
  311. data/demo/core/string/to_re.rdoc +0 -22
  312. data/demo/core/string/unfold.rdoc +0 -9
  313. data/demo/core/string/unindent.rdoc +0 -65
  314. data/demo/core/string/unquote.rdoc +0 -6
  315. data/demo/core/string/variablize.rdoc +0 -7
  316. data/demo/core/string/word_wrap.rdoc +0 -54
  317. data/demo/core/string/words.rdoc +0 -13
  318. data/demo/core/string/xor.rdoc +0 -8
  319. data/lib/core/facets/binding/local_variables.rb +0 -16
  320. data/lib/core/facets/string/tab.rb +0 -2
  321. data/lib/core/facets/string/tabto.rb +0 -2
  322. data/test/core/array/test_after.rb +0 -27
  323. data/test/core/array/test_combination.rb +0 -25
  324. data/test/core/array/test_index.rb +0 -20
  325. data/test/core/array/test_permutation.rb +0 -20
  326. data/test/core/array/test_product.rb +0 -64
  327. data/test/core/array/test_rotate.rb +0 -38
  328. data/test/core/array/test_select.rb +0 -16
  329. data/test/core/binding/test_eval.rb +0 -15
  330. data/test/core/binding/test_local_variables.rb +0 -36
  331. data/test/core/enumerable/test_cluster_by.rb +0 -30
  332. data/test/core/enumerable/test_count.rb +0 -32
  333. data/test/core/enumerable/test_each_with_object.rb +0 -18
  334. data/test/core/enumerable/test_group_by.rb +0 -36
  335. data/test/core/enumerable/test_none.rb +0 -29
  336. data/test/core/enumerable/test_one.rb +0 -34
  337. data/test/core/enumerable/test_take.rb +0 -15
  338. data/test/core/hash/test_select.rb +0 -44
  339. data/test/core/hash/test_url_params.rb +0 -26
  340. data/test/core/integer/test_even.rb +0 -24
  341. data/test/core/integer/test_odd.rb +0 -24
  342. data/test/core/kernel/test_require_relative.rb +0 -12
  343. data/test/core/nilclass/test_to_f.rb +0 -13
  344. data/test/core/proc/test_curry.rb +0 -38
  345. data/test/core/string/test_bytes.rb +0 -13
  346. data/test/core/string/test_each_char.rb +0 -17
  347. data/test/core/string/test_end_with.rb +0 -24
  348. data/test/core/string/test_lines.rb +0 -15
  349. data/test/core/string/test_start_with.rb +0 -24
  350. data/test/core/string/test_tab.rb +0 -16
  351. data/test/core/symbol/test_to_proc.rb +0 -35
  352. data/test/core/to_hash_tc.rb +0 -210
  353. data/test/core/unboundmethod/test_name.rb +0 -19
@@ -0,0 +1,13 @@
1
+ ## Array#after
2
+
3
+ require 'facets/array/after'
4
+
5
+ `Array#after` returns the first value that comes after a given value. The
6
+ value after the last is the first. Returns `nil` if the given value is not
7
+ in the array.
8
+
9
+ sequence = ['a', 'b', 'c']
10
+ sequence.after('a').assert == 'b'
11
+ sequence.after('b').assert == 'c'
12
+ sequence.after('c').assert == 'a'
13
+ sequence.after('d').assert == nil
@@ -0,0 +1,17 @@
1
+ ## Array#arrange
2
+
3
+ require 'facets/array/arrange'
4
+
5
+ The `arrange` method produces appropriate ranges from the objects in the array.
6
+ It assumes inclusive ranges (i.e. `1..4`) and `range.first <= range.last`.
7
+
8
+ Works with integers, dates and strings. However, all the objects in the array must
9
+ be of the same class.
10
+
11
+ [1,2,3,6,7,8].arrange.assert == [1..3, 6..8]
12
+
13
+ [10..15, 16..20, 21, 22].arrange.assert == [10..22]
14
+
15
+ a = %w{a b c g h i j k m o}
16
+ a.arrange.assert == ['a'..'c','g'..'k', 'm' , 'o']
17
+
@@ -0,0 +1,14 @@
1
+ ## Array#before
2
+
3
+ require 'facets/array/before'
4
+
5
+ Returns the value prior to the given value. The value previous
6
+ to the first is the last. Returns nil if the given value is not
7
+ in the array.
8
+
9
+ sequence = ['a', 'b', 'c']
10
+ sequence.before('a').assert == 'c'
11
+ sequence.before('b').assert == 'a'
12
+ sequence.before('c').assert == 'b'
13
+ sequence.before('d').assert == nil
14
+
@@ -0,0 +1,15 @@
1
+ ## Array#collapse
2
+
3
+ require 'facets/array/collapse'
4
+
5
+ Simplify an array by flattening it then compacting it.
6
+
7
+ [1,[2,nil,[3]],nil,4].collapse.assert == [1,2,3,4]
8
+
9
+ ## Array#collapse!
10
+
11
+ Simplify an array by flattening it in place then compacting it in place.
12
+
13
+ a = [1, nil, [1, 2], nil, [[3]]]
14
+ a.collapse!
15
+ a.assert == [1, 1, 2, 3]
@@ -0,0 +1,30 @@
1
+ ## Array#collisions
2
+
3
+ _alias for Array#commonality_.
4
+
5
+ require 'facets/array/collisions'
6
+
7
+ Get a list of all items that have something in common in terms of the
8
+ supplied block. If no block is given objects are considered to be in
9
+ common if they return the same value for Object#hash and if obj1 == obj2.
10
+
11
+ This can be useful, for instance, in determining all persons that share
12
+ their last name with another person.
13
+
14
+ Person = Struct.new(:name)
15
+ persons = %w{Wayne Pennyworth Grayson Wayne Pennyworth}.map{|n| Person.new(n)}
16
+ persons.collisions { |person| person.name }.keys.assert == ["Wayne","Pennyworth"]
17
+
18
+ The method is similar to #group_by which is a standard Ruby method as of 1.9.
19
+ To get effectively the same results with #group_by use `select{ |k,v| v.size > 1 }`.
20
+
21
+ expected = { 2 => [2, 2], 4 => [4, 4] }
22
+
23
+ [1, 2, 2, 3, 4, 4].group_by{ |e| e }.
24
+ select{ |k,v| v.size > 1 }.assert == expected
25
+
26
+ [1, 2, 2, 3, 4, 4].collisions.assert == expected
27
+
28
+ %w{foo bar baz}.collisions{|str| str[0]}.assert == {'b' =>["bar", "baz"] }
29
+
30
+ Returns a Hash mapping common attribute to those elements.
@@ -0,0 +1,31 @@
1
+ ## Array#commonality
2
+
3
+ require 'facets/array/commonality'
4
+
5
+ Get a list of all items that have something in common in terms of the
6
+ supplied block. If no block is given objects are considered to be in
7
+ common if they return the same value for Object#hash and if obj1 == obj2.
8
+
9
+ This can be useful, for instance, in determining all persons that share
10
+ their last name with another person.
11
+
12
+ Person = Struct.new(:name)
13
+ persons = %w{Wayne Pennyworth Grayson Wayne Pennyworth}.map{|n| Person.new(n)}
14
+ persons.commonality { |person| person.name }.keys # => ["Wayne","Pennyworth"]
15
+
16
+ The method is similar to #group_by which is a standard Ruby method as of 1.9.
17
+ To get effectively the same results with #group_by use `select{ |k,v| v.size > 1 }`.
18
+
19
+ expected = { 2 => [2, 2], 4 => [4, 4] }
20
+
21
+ [1, 2, 2, 3, 4, 4].group_by{ |e| e }.
22
+ select{ |k,v| v.size > 1 }.assert == expected
23
+
24
+ [1, 2, 2, 3, 4, 4].commonality.assert == expected
25
+
26
+
27
+ %w{foo bar baz}.commonality{|str| str[0]}.assert == {'b' =>["bar", "baz"] }
28
+
29
+ Returns a Hash mapping common attribute to those elements.
30
+
31
+
@@ -0,0 +1,47 @@
1
+ ## Array#conjoin
2
+
3
+ require 'facets/array/conjoin'
4
+
5
+ This is more advanced form of #join. It allows for fine control
6
+ of separators.
7
+
8
+ NOTE: The old version used to default its separator to ", " and
9
+ default the terminating separator to " and ". This is no longer
10
+ the case. You must specifically provide these parameters.
11
+
12
+ If no parameters are given, it acts like #join but will a space
13
+ separator.
14
+
15
+ [1,2,3].conjoin.assert == "1 2 3"
16
+
17
+ Use comma+space and 'and' on tail.
18
+
19
+ [1,2,3].conjoin(', ', ' and ').assert == "1, 2 and 3"
20
+
21
+ Use comma+space and 'or' on tail using :last option.
22
+
23
+ [1,2,3].conjoin(', ', :last => ' or ').assert == "1, 2 or 3"
24
+
25
+ Use semicolon+space and ampersand on tail using index.
26
+
27
+ [1,2,3].conjoin('; ', -1 => ' & ').assert == "1; 2 & 3"
28
+
29
+ Can take a block to determine separator.
30
+
31
+ [1,2,3,4].conjoin{ |i, a, b| i % 2 == 0 ? '.' : '-' }.assert == "1.2-3.4"
32
+
33
+ This makes very esoteric transformation possible.
34
+
35
+ [1,1,2,2].conjoin{ |i, a, b| a == b ? '=' : ' != ' }.assert == "1=1 != 2=2"
36
+
37
+ [1,2,3,4].conjoin{ |i, x, y| "<#{i} #{x} #{y}>" }.assert == "1<0 1 2>2<1 2 3>3<2 3 4>4"
38
+
39
+ There are also spacing options. Providing the :space option
40
+ pads the separators.
41
+
42
+ [1,2,3].conjoin(',', '&', :space=>2).assert == "1 , 2 & 3"
43
+
44
+ And the :spacer option can set an alternate spacing string.
45
+
46
+ [1,2,3].conjoin('|', '>', :space=>2, :spacer=>'-').assert == "1--|--2-->--3"
47
+
@@ -0,0 +1,9 @@
1
+ ## Array#contains?
2
+
3
+ _alias of Array#include? _
4
+
5
+ require 'facets/array/contains'
6
+
7
+ [1,2,3,4].assert.contains?(2)
8
+ [1,2,3,4].refute.contains?(9)
9
+
@@ -0,0 +1,13 @@
1
+ ## Array#delete_unless
2
+
3
+ require 'facets/array/delete_unless'
4
+
5
+ The method `#delete_unless` is the inverse of `#delete_if`.
6
+
7
+ a = [1,2,3]
8
+ a.delete_unless{ |e| e == 2 }
9
+ a.assert == [2]
10
+
11
+ [1,2,3].delete_unless{ |x| x < 2 }.assert == [1]
12
+ [1,2,3].delete_unless(&:even?).assert == [2]
13
+
@@ -0,0 +1,10 @@
1
+ ## Array#delete_values
2
+
3
+ require 'facets/array/delete_values'
4
+
5
+ Delete multiple values from array.
6
+
7
+ a = [1,2,3,4]
8
+ a.delete_values(1,2) #=> [1,2]
9
+ a #=> [3,4]
10
+
@@ -0,0 +1,15 @@
1
+ ## Array#delete_values_at
2
+
3
+ require 'facets/array/delete_values_at'
4
+
5
+ Delete multiple values from array given
6
+ indexes or index range.
7
+
8
+ a = [1,2,3,4]
9
+ a.delete_values_at(1,2).assert == [2,3]
10
+ a.assert == [1,4]
11
+
12
+ a = [1,2,3,4]
13
+ a.delete_values_at(0..2).assert == [1,2,3]
14
+ a.assert == [4]
15
+
@@ -0,0 +1,14 @@
1
+ ## Array#divide
2
+
3
+ require 'facets/array/divide'
4
+
5
+ Divide into sub arrays at elemetns matching given pattern
6
+
7
+ r = ['a1','b1','a2','b2'].divide(/^a/)
8
+ r.assert == [['a1','b1'],['a2','b2']]
9
+
10
+ r = ['a1','b1','a2','b2'].divide(/^b/)
11
+ r.assert == [['a1'],['b1','a2'],['b2']]
12
+
13
+ r = ['a1','b1','a2','b2'].divide(/c/)
14
+ r.assert = [['a1','b1','a2','b2']]
@@ -0,0 +1,14 @@
1
+ ## Array#duplicates
2
+
3
+ require 'facets/array/duplicates'
4
+
5
+ Return list of duplicate elements.
6
+
7
+ [1,1,2,3].duplicates #=> [1]
8
+
9
+ Return list of those duplicated min times.
10
+
11
+ [1,1,2,3,2,4,5,4,2].duplicates(3) #=> [2]
12
+
13
+
14
+
@@ -0,0 +1,12 @@
1
+ ## Array#each_overlap
2
+
3
+ require 'facets/array/each_overlap'
4
+
5
+ Iterate over each slice where the last n values of a preceding slice
6
+ overlap with the first n values of the following slice. The value of n
7
+ is specified by the second `overlap` argument.
8
+
9
+ a, r = [1,2,3,4,5], []
10
+ a.each_overlap(2,1) { |x,y| r << [x,y] }
11
+ r.assert == [[1,2],[2,3],[3,4],[4,5]]
12
+
@@ -0,0 +1,13 @@
1
+ ## Array#each_pair
2
+
3
+ require 'facets/array/each_pair'
4
+
5
+ Iterate over an array yielding with index and value.
6
+
7
+ result = {}
8
+ a = [:a,:b,:c,:d]
9
+ a.each_pair{|i,e| result[e] = i + 1}
10
+ result.assert == {a: 1, b: 2, c: 3, d: 4}
11
+
12
+ *NOTE* this is the inverse of `Array#each_with_index`, and is intended to provide
13
+ polymorphism with `Hash#each_pair`.
@@ -0,0 +1,12 @@
1
+ ## Array#each_value
2
+
3
+ require 'facets/array/each_value'
4
+
5
+ This is an alias of Alias#each, and is provided to provide polymorphism with
6
+ Hash#each_value.
7
+
8
+ a = [ "a", "b", "c" ]
9
+ out = ''
10
+ a.each_value {|x| out += "#{x} -- " }
11
+ out.assert == 'a -- b -- c -- '
12
+
@@ -0,0 +1,13 @@
1
+ ## Array#entropy
2
+
3
+ require 'facets/array/entropy'
4
+
5
+ Shannon's entropy for an array - returns the average
6
+ bits per symbol required to encode the array.
7
+ Lower values mean less "entropy" - i.e. less unique
8
+ information in the array.
9
+
10
+ e = %w{ a b c d e e e }.entropy
11
+
12
+ ("%.3f" % e) #=> "2.128"
13
+
@@ -0,0 +1,13 @@
1
+ ## Array#extract_options!
2
+
3
+ require 'facets/array/extract_options'
4
+
5
+ Extracts options from a set of arguments. Removes and returns the last
6
+ element in the array if it's a hash, otherwise returns a blank hash.
7
+
8
+ def options(*args)
9
+ args.extract_options!
10
+ end
11
+
12
+ options(1, 2).assert == {}
13
+ options(1, 2, :a => :b).assert == {:a=>:b}
@@ -0,0 +1,11 @@
1
+ ## Array#first!
2
+
3
+ require 'facets/array/indexable'
4
+
5
+ Alias for shift, which removes and returns the first element in an array
6
+
7
+ a = ['a','y','z']
8
+ a.first!.assert == 'a'
9
+ a.assert ['y','z']
10
+
11
+
@@ -0,0 +1,11 @@
1
+ ## Array#thru
2
+
3
+ require 'facets/array/from'
4
+
5
+ Returns elements from index i until the end.
6
+
7
+ %w{W o r l d}.from(3).assert == %w{l d}
8
+
9
+ Returns entire array for i > length
10
+
11
+ %w{W o r l d}.from(7).assert == nil
@@ -0,0 +1,11 @@
1
+ ## Array#ideal_entropy
2
+
3
+ require 'facets/array/entropy'
4
+
5
+ Returns the maximum possible Shannon entropy of the array
6
+ with given size assuming that it is an "order-0" source
7
+ (each element is selected independently of the next).
8
+
9
+ %w{ a b }.ideal_entropy.assert == 1.0
10
+ %w{ a a b b }.ideal_entropy.assert == 2.0
11
+
@@ -0,0 +1,11 @@
1
+ ## Array#intersection
2
+
3
+ require 'facets/array/intersection'
4
+
5
+ Returns the values in common for an array set (nil, single value/object, or range).
6
+
7
+ [1,2].intersection.assert == nil
8
+ [1..10,11..20].intersection.assert == nil
9
+ [10,1..10].intersection.assert == 10
10
+ [1..10,5,5..8,4..8].intersection.assert == 5
11
+ [1..10, 5..8, 5..10 ].intersection.assert == (5..8)
@@ -0,0 +1,11 @@
1
+ ## Array#last!
2
+
3
+ require 'facets/array/indexable'
4
+
5
+ Alias for pop, which removes and returns the last element in an
6
+ array.
7
+
8
+ a = [1,2,3]
9
+ a.last!.assert == 3
10
+ a.assert == [1,2]
11
+
@@ -0,0 +1,23 @@
1
+ # Array#median
2
+
3
+ require 'facets/array/median'
4
+
5
+ Determines the _sorted_ middle element.
6
+
7
+ a = %w{a a b b c c c}
8
+ a.median #=> "b"
9
+
10
+ When there are an even number of elements, the greater
11
+ of the two middle elements is given.
12
+
13
+ a = %w{a a b b c c c d}
14
+ a.median #=> "c"
15
+
16
+ An offset can be supplied to get an element relative
17
+ to the middle.
18
+
19
+ a = %w{a a b b c c c d}
20
+ a.median(-1) #=> "b"
21
+
22
+ The the array is empty, +nil+ is returned.
23
+
@@ -0,0 +1,15 @@
1
+ ## Array#merge
2
+
3
+ require 'facets/array/merge'
4
+
5
+ a = [1,2,3]
6
+ b = [3,4,5]
7
+ a.merge(b).assert == [1,2,3,4,5]
8
+
9
+ ## Array#merge!
10
+
11
+ a = [1,2,3]
12
+ b = [3,4,5]
13
+ a.merge!(b)
14
+ a.assert == [1,2,3,4,5]
15
+
@@ -0,0 +1,10 @@
1
+ ## Array#missing
2
+
3
+ require 'facets/array/missing'
4
+
5
+ Determine the 'holes' in the values of an array. Returns the missing elements
6
+ in an array set.
7
+
8
+ [1,3..3].missing.assert == [2]
9
+ [1..5,10..12].missing.assert == [6..9]
10
+ [100, 9..11, 14, 1..5, 16, 10..12, 17..17].missing.assert == [6..8, 13, 15, 18..99]