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,9 @@
1
+ ## Array#mode
2
+
3
+ require 'facets/array/mode'
4
+
5
+ In Statistics, mode is the value that occurs most frequently in a given set of
6
+ data. This method returns an array in case there is a tie.
7
+
8
+ [1, 1, 2, 3].mode.assert == [1]
9
+ [1, 1, 2, 2, 3].mode.assert == [1,2]
@@ -0,0 +1,16 @@
1
+ ## Array#nonuniq
2
+
3
+ require 'facets/array/nonuniq'
4
+
5
+ Returns a list of non uniq elements.
6
+
7
+ a = [1, 1, 2, 2, 3, 4, 5]
8
+ a.nonuniq.sort.assert == [1, 2]
9
+
10
+ ## Array#nonuniq!
11
+
12
+ Same as #nonuniq but acts in place.
13
+
14
+ a = [1, 1, 2, 2, 3, 4, 5]
15
+ a.nonuniq!
16
+ a.sort.assert == [1,2]
@@ -0,0 +1,8 @@
1
+ ## Array#not_empty?
2
+
3
+ require 'facets/array/not_empty'
4
+
5
+ Array is not empty?
6
+
7
+ [1,2].assert.not_empty?
8
+ [].refute.not_empty?
@@ -0,0 +1,18 @@
1
+ ## Array#occur
2
+
3
+ require 'facets/array/occur'
4
+
5
+ Returns a list of elements that occur +n+ times.
6
+
7
+ If +n+ is a Range then returns elements that occur a number
8
+ of time within the range.
9
+
10
+ a = [:a,:b,:a]
11
+ a.occur(1).assert == [:b]
12
+ a.occur(2).assert == [:a]
13
+
14
+ a = [:a,:b,:a]
15
+ a.occur(1..2).assert == [:a,:b]
16
+
17
+ a = [:a,:b,:a]
18
+ a.occur{ |n| n % 2 == 0 }.assert == [:a]
@@ -0,0 +1,13 @@
1
+ ## Array#occurrence
2
+
3
+ require 'facets/array/occurrence'
4
+
5
+ Create a hash of each uniq element of the array
6
+ and how many time each appears.
7
+
8
+ r = [:a,:a,:b,:c,:c,:c].occurrence
9
+ r.assert == { :a => 2, :b => 1, :c => 3 }
10
+
11
+ r = [2,2,3,4,4,4].occurrence{|i| i % 2}
12
+ r.assert == { 0 => 5, 1 => 1 }
13
+
@@ -0,0 +1,9 @@
1
+ ## Array#only
2
+
3
+ require 'facets/array/only'
4
+
5
+ [5].only.assert == 5
6
+ [nil].only.assert == nil
7
+ expect(IndexError){ [].only }
8
+ expect(IndexError){ [1,2,3].only }
9
+
@@ -0,0 +1,10 @@
1
+ ## Array#**
2
+
3
+ require 'facets/array/op_pow'
4
+
5
+ Alias for Array#product
6
+
7
+ NOTE: This method is not a common core extension and is not loaded automatically
8
+ when using ```require 'facets'```
9
+
10
+ ([1,2] ** [3,4]).assert == [[1, 3], [1, 4], [2, 3], [2, 4]]
@@ -0,0 +1,28 @@
1
+ ## Array#pad
2
+
3
+ require 'facets/array/pad'
4
+
5
+ r = [0,1,2,3].pad(7,"x")
6
+ x = [0,1,2,3,"x","x","x"]
7
+ r.assert == x
8
+
9
+ negative index
10
+
11
+ r = [0,1,2,3].pad(-7,"n")
12
+ x = ["n","n","n",0,1,2,3]
13
+ r.assert == x
14
+
15
+ ## Array#pad!
16
+
17
+ a = [0,1,2,3]
18
+ r = a.pad!(6,"y")
19
+ x = [0,1,2,3,"y","y"]
20
+ r.assert == x
21
+
22
+ negative index
23
+
24
+ a = [0,1,2,3]
25
+ r = a.pad!(-6,"q")
26
+ x = ["q","q",0,1,2,3]
27
+ r.assert == x
28
+
@@ -0,0 +1,10 @@
1
+ ## Array#peek
2
+
3
+ require 'facets/array/peek'
4
+
5
+ Provide an index to inspect the array from back to front.
6
+
7
+ [1,2,3].peek .assert == 3
8
+ [1,2,3].peek(1) .assert == 2
9
+ [1,2,3].peek(-1).assert == 1
10
+
@@ -0,0 +1,15 @@
1
+ ## Array#poke
2
+
3
+ require 'facets/array/poke'
4
+
5
+ Put an object on the bottom of the stack (front of the array).
6
+
7
+ a = [2,3]
8
+ a.poke(1)
9
+ a.assert == [1,2,3]
10
+
11
+ Or supply an index and #poke works like insert.
12
+
13
+ a = [1,3]
14
+ a.poke(2,1)
15
+ a.assert == [1,2,3]
@@ -0,0 +1,8 @@
1
+ ## Array#probability
2
+
3
+ require 'facets/array/probability'
4
+
5
+ Generates a hash mapping each unique element in the array to the relative
6
+ frequency, i.e. the probability, of it's appearance.
7
+
8
+ [:a, :b, :c, :c].probability.assert == {a: 0.25, b: 0.25, c: 0.50}
@@ -0,0 +1,10 @@
1
+ ## Array#pull
2
+
3
+ require 'facets/array/pull'
4
+
5
+ Alias for Array#shift which removes an object off the first slot of an array.
6
+ This is the opposite of pop.
7
+
8
+ a = [1,2,3]
9
+ a.pull.assert == 1
10
+ a.assert == [2,3]
@@ -0,0 +1,10 @@
1
+ ## Array#recurse
2
+
3
+ require 'facets/array/recurse'
4
+
5
+ Apply a block to array, and recursively apply that block to each sub-array
6
+ or +type+.
7
+
8
+ a = ["a", ["b", "c", nil], nil]
9
+ r = a.recurse{|a| a.compact!}
10
+ r.assert == ["a", ["b", "c"]]
@@ -0,0 +1,20 @@
1
+ ## Array#recursively
2
+
3
+ require 'facets/array/recursively'
4
+
5
+ Apply a method to array, and recursively apply that method to each sub-array
6
+ or given +types+.
7
+
8
+ By default the sub-types are passed through unaffected. Passing a block
9
+ to #recursively can be used to change this.
10
+
11
+ each
12
+
13
+ r = []
14
+ [1,2,['a','b'], 3].recursively.each{|v| r << v}
15
+ r.assert = [1,2,'a','b', 3]
16
+
17
+ map
18
+
19
+ arr = ['foo','bar',['a','b']]
20
+ arr.recursively.map{|v| v.to_sym}.assert == [:foo,:bar,[:a,:b]]
@@ -0,0 +1,10 @@
1
+ ## Array#reject_values
2
+
3
+ require 'facets/array/reject_values'
4
+
5
+ Non-destructive form of Array#delete_values. Unlike delete_values this method
6
+ returns a new array.
7
+
8
+ a = [1,2,3,4,5]
9
+ a.reject_values(2,4).assert == [1,3,5]
10
+ a.assert [1,2,3,4,5]
@@ -0,0 +1,14 @@
1
+ ## Array#splice
2
+
3
+ require 'facets/array/splice'
4
+
5
+ Splice acts as a combination of #slice! and #store. If one argument is given it
6
+ calls #slice!, if two are given it calls #store.
7
+
8
+ a = [1,2,3]
9
+ a.splice(1).assert == 2
10
+ a.assert == [1,3]
11
+
12
+ b = [1,2,3]
13
+ b.splice(1,4).assert == 4
14
+ b.assert == [1,4,3]
@@ -0,0 +1,13 @@
1
+ ## Array#split
2
+
3
+ require 'facets/array/split'
4
+
5
+ Split on matching pattern. Unlike #divide, this does not include matching
6
+ elements.
7
+
8
+ ['a','b','c'].split('b').assert == [['a'],['c']]
9
+
10
+ a = ['a1','a2','b1','a3','b2','a4']
11
+ a.split(/^b/).assert == [['a1','a2'],['a3'],['a4']]
12
+
13
+
@@ -0,0 +1,14 @@
1
+ ## Array#squeeze!
2
+
3
+ require 'facets/array/squeeze'
4
+
5
+ Destructive version of Enumerable#squeeze.
6
+
7
+ a = [1,2,2,3,3,2,1]
8
+ a.squeeze!
9
+ a.assert == [1,2,3,2,1]
10
+
11
+ a = [1,2,2,3,3,2,1]
12
+ a.squeeze!(3)
13
+ a.assert == [1,2,2,3,2,1]
14
+
@@ -0,0 +1,16 @@
1
+ ## Array#step
2
+
3
+ require 'facets/array/step'
4
+
5
+ Iterate over every nth element of an array. Without a block, it returns an
6
+ Enumerator.
7
+
8
+ r = []
9
+ [:a, :b, :c, :d].step(2) { |x| r << x }
10
+ r.assert == [:b, :d]
11
+
12
+ [:a, :b, :c, :d].step(1).to_a.assert == [:a, :b, :c, :d]
13
+ [:a, :b, :c, :d].step(2).to_a.assert == [:b, :d]
14
+ [:a, :b, :c, :d].step(3).to_a.assert == [:c]
15
+ [:a, :b, :c, :d].step(4).to_a.assert == [:d]
16
+ [:a, :b, :c, :d].step(5).to_a.assert == []
@@ -0,0 +1,9 @@
1
+ ## Array#store
2
+
3
+ require 'facets/array/store'
4
+
5
+ Store a value at a given index. Store is an alias for #[]=
6
+
7
+ a = []
8
+ a.store(1,"A")
9
+ a[1].assert == "A"
@@ -0,0 +1,12 @@
1
+ ## Array#thru
2
+
3
+ require 'facets/array/thru'
4
+
5
+ Fetch Values from a start index thru an end index.
6
+
7
+ [1,2,3,4,5].thru(0,2) #=> [1,2,3]
8
+ [1,2,3,4,5].thru(2,4) #=> [3,4,5]
9
+
10
+ [1,2,3,4,5].thru(2) #=> [1,2,3]
11
+ [1,2,3,4,5].thru(4) #=> [1,2,3,4,5]
12
+
@@ -0,0 +1,11 @@
1
+ ## Array#to_h
2
+
3
+ require 'facets/array/to_h'
4
+
5
+ Convert an associative array to a Hash. Each element of the associative array
6
+ should be a 1 or 2 element array
7
+
8
+ Note this is built into ruby as of 2.1.0
9
+
10
+ arr = [[:a, 1], [:b, 2]]
11
+ arr.to_h.assert == {:a => 1, :b => 2}
@@ -0,0 +1,20 @@
1
+ ## Array#traverse
2
+
3
+ require 'facets/array/traverse'
4
+
5
+ Construct a new array created by traversing the array and its sub-arrays,
6
+ executing the given block on the elements.
7
+
8
+ h = ['A', 'B', ['X', 'Y']]
9
+ g = h.traverse{ |e| e.downcase }
10
+ g.assert = ['a','b',['x', 'y']]
11
+
12
+ ## Array#traverse!
13
+
14
+ Like #traverse, but will change the array in place.
15
+
16
+ h = ['A', 'B', ['X', 'Y']]
17
+ h.traverse!{ |e| e.downcase }
18
+ h.assert = ['a','b',['x', 'y']]
19
+
20
+
@@ -0,0 +1,16 @@
1
+ ## Array#uniq_by!
2
+
3
+ require 'facets/array/uniq_by'
4
+
5
+ Like #uniq, but determines uniqueness based on a given block.
6
+ As can be seen from the examples, order is significant.
7
+
8
+ r = (-5..5).to_a
9
+ r.uniq_by!{ |i| i*i }
10
+ r.assert == [-5, -4, -3, -2, -1, 0]
11
+
12
+ r = (-5..5).to_a.reverse
13
+ r.uniq_by!{ |i| i*i }
14
+ r.assert == [5, 4, 3, 2, 1, 0]
15
+
16
+
@@ -0,0 +1,14 @@
1
+ ## Array#unique_permutation
2
+
3
+ require 'facets/array/unique_permutation'
4
+
5
+ Enumerates permutation of Array. Unlike Array#permutation, there are no
6
+ duplicates in generated permutations. Instead elements must be comparable
7
+
8
+ p = [1,1,2,2,3].unique_permutation(2).to_a
9
+ e = [[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2]]
10
+ p.assert == e
11
+
12
+ [1,1,2,3].unique_permutation.to_a.assert != [1,1,2,3].permutation.to_a
13
+
14
+ [1,1,2,3].unique_permutation.to_a.assert == [1,1,2,3].permutation.to_a.uniq
@@ -0,0 +1,8 @@
1
+ ## Array::zip
2
+
3
+ require 'facets/array/zip'
4
+
5
+ Class level rendition of Array#zip
6
+
7
+ Array.zip([1,2], [3,4]).assert == [[1,3],[2,4]]
8
+
@@ -0,0 +1,57 @@
1
+ The caller.rb script includes a few related methods.
2
+ We will use the following code to demonstrate their use.
3
+
4
+ require 'facets/binding/caller'
5
+
6
+ a = 1
7
+ b = 2
8
+ x = "hello"
9
+
10
+ @bind = binding
11
+ @line = __LINE__ # the line number must be updated if it moves
12
+ @file = __FILE__ # why does it equal basename only?
13
+
14
+ ## Binding#caller
15
+
16
+ @bind.caller
17
+
18
+ ## Binding#callstack
19
+
20
+ @bind.callstack.assert.is_a?(Array)
21
+
22
+ ## Binding#__LINE__
23
+
24
+ @bind.__LINE__.assert == @line - 1
25
+
26
+ ## Binding#__FILE__
27
+
28
+ @bind.__FILE__.assert == @file
29
+
30
+ ## Binding#__DIR__
31
+
32
+ @bind.__DIR__.assert == File.dirname(@file)
33
+
34
+ ## Binding#__callee__
35
+
36
+ This only works for certain versions.
37
+
38
+ def alternate_callee
39
+ binding
40
+ end
41
+
42
+ unless RUBY_VERSION < "1.9"
43
+ alternate_callee.__callee__.assert == :alternate_callee
44
+ end
45
+
46
+ ## Binding#__method__
47
+
48
+ This only works for certain versions.
49
+
50
+ def alternate_method
51
+ binding
52
+ end
53
+
54
+ unless RUBY_VERSION < "1.8.7"
55
+ alternate_method.__method__.assert == :alternate_method
56
+ end
57
+
@@ -0,0 +1,10 @@
1
+ ## Binding#defined?
2
+
3
+ require 'facets/binding/defined'
4
+
5
+ a = 1
6
+ b = 2
7
+ x = "hello"
8
+
9
+ binding.assert.defined?("x")
10
+