facets 2.9.3 → 3.0.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 (491) hide show
  1. checksums.yaml +7 -0
  2. data/.index +76 -0
  3. data/CONTRIBUTE.md +78 -0
  4. data/HISTORY.md +2459 -0
  5. data/{RUBY.txt → LICENSE.txt} +0 -0
  6. data/README.rdoc +29 -7
  7. data/demo/applique/assertion_framework.rb +1 -0
  8. data/{qed → demo}/applique/file_helpers.rb +0 -0
  9. data/{qed → demo}/core/array/combination.rdoc +0 -0
  10. data/{qed → demo}/core/array/delete.rdoc +0 -0
  11. data/{qed → demo}/core/array/index.rdoc +0 -0
  12. data/{qed → demo}/core/array/merge.rdoc +0 -0
  13. data/{qed → demo}/core/array/only.rdoc +0 -0
  14. data/{qed → demo}/core/array/pad.rdoc +0 -0
  15. data/{qed → demo}/core/array/permutation.rdoc +0 -0
  16. data/{qed → demo}/core/array/product.rdoc +0 -0
  17. data/{qed → demo}/core/array/recursively.rdoc +0 -0
  18. data/{qed → demo}/core/array/rotate.rdoc +0 -0
  19. data/{qed → demo}/core/array/select.rdoc +0 -0
  20. data/{qed → demo}/core/array/uniq_by.rdoc +0 -0
  21. data/{qed → demo}/core/binding/caller.rdoc +0 -0
  22. data/{qed → demo}/core/binding/defined.rdoc +0 -0
  23. data/{qed → demo}/core/binding/eval.rdoc +0 -0
  24. data/{qed → demo}/core/binding/local_variables.rdoc +0 -0
  25. data/{qed → demo}/core/binding/opvars.rdoc +0 -0
  26. data/{qed → demo}/core/binding/self.rdoc +0 -0
  27. data/{qed → demo}/core/class/descendants.rdoc +0 -0
  28. data/{qed → demo}/core/class/to_proc.rdoc +0 -0
  29. data/{qed → demo}/core/comparable/cap.rdoc +0 -0
  30. data/{qed → demo}/core/comparable/clip.rdoc +0 -0
  31. data/{qed → demo}/core/comparable/cmp.rdoc +0 -0
  32. data/{qed → demo}/core/comparable/op_get.rdoc +0 -0
  33. data/{qed → demo}/core/dir/ascend.rdoc +0 -0
  34. data/{qed → demo}/core/dir/descend.rdoc +0 -0
  35. data/{qed → demo}/core/dir/multiglob.rdoc +0 -0
  36. data/{qed → demo}/core/dir/parent.rdoc +0 -0
  37. data/{qed → demo}/core/dir/recurse.rdoc +0 -0
  38. data/{qed → demo}/core/exception/detail.rdoc +0 -0
  39. data/{qed → demo}/core/facets.rdoc +0 -0
  40. data/{qed → demo}/core/filetest/root.rdoc +0 -0
  41. data/{qed → demo}/core/hash/recursively.rdoc +0 -0
  42. data/{qed → demo}/core/indexable.rdoc +0 -0
  43. data/{qed → demo}/core/integer/bitmask.rdoc +0 -0
  44. data/{qed → demo}/core/integer/even.rdoc +0 -0
  45. data/{qed → demo}/core/integer/factorial.rdoc +0 -0
  46. data/{qed → demo}/core/integer/length.rdoc +0 -0
  47. data/{qed → demo}/core/integer/multiple.rdoc +0 -0
  48. data/{qed → demo}/core/integer/odd.rdoc +0 -0
  49. data/{qed → demo}/core/integer/of.rdoc +0 -0
  50. data/{qed → demo}/core/integer/ordinal.rdoc +0 -0
  51. data/{qed → demo}/core/matchdata/match.rdoc +0 -0
  52. data/{qed → demo}/core/matchdata/matchset.rdoc +0 -0
  53. data/{qed → demo}/core/module/cattr.rdoc +0 -0
  54. data/{qed → demo}/core/module/class_extend.rdoc +0 -0
  55. data/{qed → demo}/core/module/class_inheritor.rdoc +0 -0
  56. data/{qed → demo}/core/module/copy_inheritor.rdoc +0 -0
  57. data/{qed → demo}/core/module/method_space.rdoc +0 -0
  58. data/{qed → demo}/core/string/align.rdoc +0 -0
  59. data/{qed → demo}/core/string/bracket.rdoc +0 -0
  60. data/{qed → demo}/core/string/bytes.rdoc +0 -0
  61. data/{qed → demo}/core/string/camelcase.rdoc +0 -0
  62. data/{qed → demo}/core/string/capitalized.rdoc +0 -0
  63. data/{qed → demo}/core/string/characters.rdoc +0 -0
  64. data/{qed → demo}/core/string/cleanlines.rdoc +0 -0
  65. data/{qed → demo}/core/string/cleave.rdoc +0 -0
  66. data/{qed → demo}/core/string/divide.rdoc +0 -0
  67. data/{qed → demo}/core/string/each_char.rdoc +0 -0
  68. data/{qed → demo}/core/string/each_word.rdoc +0 -0
  69. data/{qed → demo}/core/string/end_with.rdoc +0 -0
  70. data/{qed → demo}/core/string/expand_tabs.rdoc +0 -0
  71. data/{qed → demo}/core/string/fold.rdoc +0 -0
  72. data/{qed → demo}/core/string/indent.rdoc +0 -0
  73. data/{qed → demo}/core/string/interpolate.rdoc +0 -0
  74. data/{qed → demo}/core/string/lchomp.rdoc +0 -0
  75. data/{qed → demo}/core/string/line_wrap.rdoc +0 -0
  76. data/{qed → demo}/core/string/lines.rdoc +0 -0
  77. data/{qed → demo}/core/string/margin.rdoc +0 -0
  78. data/{qed → demo}/core/string/methodize.rdoc +0 -0
  79. data/{qed → demo}/core/string/modulize.rdoc +0 -0
  80. data/{qed → demo}/core/string/mscan.rdoc +0 -0
  81. data/{qed → demo}/core/string/natcmp.rdoc +0 -0
  82. data/{qed → demo}/core/string/nchar.rdoc +0 -0
  83. data/{qed → demo}/core/string/newlines.rdoc +0 -0
  84. data/{qed → demo}/core/string/op_sub.rdoc +0 -0
  85. data/{qed → demo}/core/string/pathize.rdoc +0 -0
  86. data/{qed → demo}/core/string/quote.rdoc +0 -0
  87. data/{qed → demo}/core/string/range.rdoc +0 -0
  88. data/{qed → demo}/core/string/rewrite.rdoc +0 -0
  89. data/{qed → demo}/core/string/shatter.rdoc +0 -0
  90. data/{qed → demo}/core/string/snakecase.rdoc +0 -0
  91. data/{qed → demo}/core/string/splice.rdoc +0 -0
  92. data/{qed → demo}/core/string/start_with.rdoc +0 -0
  93. data/{qed → demo}/core/string/subtract.rdoc +0 -0
  94. data/{qed → demo}/core/string/tab.rdoc +0 -0
  95. data/{qed → demo}/core/string/tabto.rdoc +0 -0
  96. data/{qed → demo}/core/string/titlecase.rdoc +0 -0
  97. data/{qed → demo}/core/string/to_re.rdoc +0 -0
  98. data/{qed → demo}/core/string/unfold.rdoc +0 -0
  99. data/{qed → demo}/core/string/unindent.rdoc +0 -0
  100. data/{qed → demo}/core/string/unquote.rdoc +0 -0
  101. data/{qed → demo}/core/string/variablize.rdoc +0 -0
  102. data/{qed → demo}/core/string/word_wrap.rdoc +0 -0
  103. data/{qed → demo}/core/string/words.rdoc +0 -0
  104. data/{qed → demo}/core/string/xor.rdoc +0 -0
  105. data/{qed → demo}/standard/02_cloneable.rdoc +0 -0
  106. data/{qed → demo}/standard/03_enumargs.rdoc +0 -0
  107. data/{qed → demo}/standard/04_equitable.rdoc +0 -0
  108. data/{qed → demo}/standard/05_instantiable.rdoc +0 -0
  109. data/{qed → demo}/standard/basic_object.rdoc +0 -0
  110. data/{qed → demo}/standard/memoizable.rdoc +0 -0
  111. data/{qed → demo}/standard/mulititon.rdoc +0 -0
  112. data/lib/core/facets.rb +1 -2
  113. data/lib/core/facets.yml +61 -42
  114. data/lib/core/facets/array.rb +8 -28
  115. data/lib/core/facets/array/arrange.rb +42 -0
  116. data/lib/core/facets/array/before.rb +2 -0
  117. data/lib/core/facets/array/collapse.rb +2 -0
  118. data/lib/core/facets/array/commonality.rb +24 -12
  119. data/lib/core/facets/array/duplicates.rb +22 -1
  120. data/lib/core/facets/array/each_overlap.rb +25 -0
  121. data/lib/core/facets/array/intersection.rb +25 -0
  122. data/lib/core/facets/array/missing.rb +29 -0
  123. data/lib/core/facets/array/nonuniq.rb +7 -53
  124. data/lib/core/facets/array/occur.rb +38 -0
  125. data/lib/core/facets/array/occurrence.rb +28 -0
  126. data/lib/core/facets/array/only.rb +12 -1
  127. data/lib/core/facets/array/recursively.rb +11 -5
  128. data/lib/core/facets/array/reject_values.rb +21 -0
  129. data/lib/core/facets/array/splice.rb +5 -1
  130. data/lib/core/facets/array/split.rb +5 -2
  131. data/lib/core/facets/array/squeeze.rb +23 -0
  132. data/lib/core/facets/array/step.rb +31 -0
  133. data/lib/core/facets/array/store.rb +4 -0
  134. data/lib/core/facets/array/to_h.rb +22 -0
  135. data/lib/core/facets/array/traverse.rb +11 -5
  136. data/lib/core/facets/array/uniq_by.rb +5 -1
  137. data/lib/core/facets/array/unique_permutation.rb +29 -0
  138. data/lib/core/facets/array/zip.rb +21 -0
  139. data/lib/core/facets/binding.rb +0 -3
  140. data/lib/core/facets/binding/call_stack.rb +1 -1
  141. data/lib/core/facets/binding/caller.rb +1 -3
  142. data/lib/core/facets/binding/callstack.rb +1 -1
  143. data/lib/core/facets/binding/defined.rb +0 -2
  144. data/lib/core/facets/binding/local_variables.rb +0 -2
  145. data/lib/core/facets/binding/op_get.rb +0 -2
  146. data/lib/core/facets/binding/self.rb +1 -3
  147. data/lib/core/facets/cattr.rb +1 -0
  148. data/lib/core/facets/class.rb +0 -2
  149. data/lib/core/facets/class/cattr.rb +1 -0
  150. data/lib/core/facets/class/singleton.rb +1 -13
  151. data/lib/core/facets/class/singleton_class.rb +16 -0
  152. data/lib/core/facets/comparable.rb +0 -2
  153. data/lib/core/facets/dir.rb +0 -2
  154. data/lib/core/facets/dir/ascend.rb +2 -2
  155. data/lib/core/facets/dir/lookup.rb +20 -0
  156. data/lib/core/facets/enumerable.rb +10 -9
  157. data/lib/core/facets/enumerable/accumulate.rb +18 -16
  158. data/lib/core/facets/enumerable/apply.rb +20 -0
  159. data/lib/core/facets/enumerable/associate.rb +6 -0
  160. data/lib/core/facets/enumerable/cluster.rb +24 -0
  161. data/lib/core/facets/enumerable/every.rb +1 -1
  162. data/lib/core/facets/enumerable/ewise.rb +2 -0
  163. data/lib/core/facets/enumerable/graph.rb +0 -3
  164. data/lib/core/facets/enumerable/hashify.rb +222 -19
  165. data/lib/core/facets/enumerable/hinge.rb +18 -0
  166. data/lib/core/facets/enumerable/key_by.rb +27 -0
  167. data/lib/core/facets/enumerable/map_to.rb +13 -0
  168. data/lib/core/facets/enumerable/mash.rb +34 -1
  169. data/lib/core/facets/enumerable/occur.rb +12 -9
  170. data/lib/core/facets/enumerable/only.rb +56 -0
  171. data/lib/core/facets/enumerable/{cluster_by.rb → organize_by.rb} +5 -4
  172. data/lib/core/facets/enumerable/pair.rb +20 -0
  173. data/lib/core/facets/enumerable/per.rb +27 -35
  174. data/lib/core/facets/enumerable/recursively.rb +3 -3
  175. data/lib/core/facets/enumerable/squeeze.rb +36 -0
  176. data/lib/core/facets/enumerable/sum.rb +18 -6
  177. data/lib/core/facets/enumerable/unassociate.rb +23 -0
  178. data/lib/core/facets/enumerable/value_by.rb +25 -0
  179. data/lib/core/facets/enumerator/fx.rb +16 -25
  180. data/lib/core/facets/enumerator/lazy/squeeze.rb +33 -0
  181. data/lib/core/facets/essentials.rb +65 -0
  182. data/lib/core/facets/exception.rb +0 -2
  183. data/lib/core/facets/exception/set_message.rb +10 -0
  184. data/lib/core/facets/file.rb +1 -2
  185. data/lib/core/facets/file/common_path.rb +17 -0
  186. data/lib/core/facets/file/rootname.rb +1 -1
  187. data/lib/core/facets/filetest.rb +0 -2
  188. data/lib/core/facets/filetest/relative.rb +1 -1
  189. data/lib/core/facets/filetest/safe.rb +14 -10
  190. data/lib/core/facets/float.rb +1 -3
  191. data/lib/core/facets/float/round_to.rb +1 -0
  192. data/lib/core/facets/functor.rb +8 -10
  193. data/lib/core/facets/hash.rb +2 -5
  194. data/lib/core/facets/hash/collate.rb +22 -8
  195. data/lib/core/facets/hash/count.rb +8 -4
  196. data/lib/core/facets/hash/data.rb +5 -2
  197. data/lib/core/facets/hash/dearray_values.rb +1 -1
  198. data/lib/core/facets/hash/deep_rekey.rb +54 -0
  199. data/lib/core/facets/hash/each_with_key.rb +12 -0
  200. data/lib/core/facets/hash/fetch_nested.rb +20 -0
  201. data/lib/core/facets/hash/keys.rb +4 -13
  202. data/lib/core/facets/hash/only_keys.rb +1 -0
  203. data/lib/core/facets/hash/op_push.rb +9 -1
  204. data/lib/core/facets/hash/op_sub.rb +1 -1
  205. data/lib/core/facets/hash/recursively.rb +6 -6
  206. data/lib/core/facets/hash/rekey.rb +26 -34
  207. data/lib/core/facets/hash/revalue.rb +61 -0
  208. data/lib/core/facets/hash/slice.rb +16 -3
  209. data/lib/core/facets/hash/subset.rb +11 -8
  210. data/lib/core/facets/hash/update_each.rb +1 -1
  211. data/lib/core/facets/hash/weave.rb +1 -1
  212. data/lib/core/facets/indexable.rb +6 -6
  213. data/lib/core/facets/integer.rb +0 -4
  214. data/lib/core/facets/kernel.rb +4 -7
  215. data/lib/core/facets/kernel/__dir__.rb +2 -0
  216. data/lib/core/facets/kernel/as.rb +2 -1
  217. data/lib/core/facets/kernel/call_stack.rb +1 -56
  218. data/lib/core/facets/kernel/callstack.rb +56 -1
  219. data/lib/core/facets/kernel/constant.rb +2 -0
  220. data/lib/core/facets/kernel/deep_clone.rb +27 -1
  221. data/lib/core/facets/kernel/deep_copy.rb +0 -24
  222. data/lib/core/facets/kernel/eigen.rb +2 -33
  223. data/lib/core/facets/kernel/eigenclass.rb +1 -1
  224. data/lib/core/facets/kernel/ergo.rb +1 -1
  225. data/lib/core/facets/kernel/extend.rb +4 -6
  226. data/lib/core/facets/kernel/instance_assign.rb +8 -6
  227. data/lib/core/facets/kernel/instance_extract.rb +22 -0
  228. data/lib/core/facets/kernel/instance_replace.rb +40 -0
  229. data/lib/core/facets/kernel/{equate.rb → like.rb} +7 -4
  230. data/lib/core/facets/kernel/load_relative.rb +25 -1
  231. data/lib/core/facets/kernel/meta.rb +35 -0
  232. data/lib/core/facets/kernel/meta_def.rb +4 -0
  233. data/lib/core/facets/kernel/object_send.rb +11 -14
  234. data/lib/core/facets/kernel/respond.rb +3 -13
  235. data/lib/core/facets/kernel/tap.rb +27 -39
  236. data/lib/core/facets/load_path.rb +1 -0
  237. data/lib/core/facets/load_path/search.rb +16 -0
  238. data/lib/core/facets/matchdata.rb +0 -2
  239. data/lib/core/facets/method.rb +0 -2
  240. data/lib/core/facets/method/composition.rb +32 -16
  241. data/lib/core/facets/method/curry.rb +13 -0
  242. data/lib/core/facets/method/partial.rb +10 -0
  243. data/lib/core/facets/method/public.rb +33 -0
  244. data/lib/core/facets/module.rb +0 -2
  245. data/lib/core/facets/module/alias_class_method.rb +11 -0
  246. data/lib/core/facets/module/basename.rb +1 -31
  247. data/lib/core/facets/module/cattr.rb +1 -0
  248. data/lib/core/facets/module/lastname.rb +30 -0
  249. data/lib/core/facets/module/mattr.rb +4 -4
  250. data/lib/core/facets/nilclass.rb +0 -3
  251. data/lib/core/facets/numeric.rb +0 -4
  252. data/lib/core/facets/numeric/approx.rb +3 -2
  253. data/lib/core/facets/numeric/range.rb +12 -0
  254. data/lib/core/facets/numeric/round_to.rb +32 -1
  255. data/lib/core/facets/object.rb +2 -3
  256. data/lib/core/facets/object/itself.rb +16 -0
  257. data/lib/core/facets/objectspace.rb +0 -3
  258. data/lib/core/facets/proc.rb +0 -3
  259. data/lib/core/facets/proc/bind_to.rb +3 -3
  260. data/lib/core/facets/proc/wrap.rb +17 -0
  261. data/lib/core/facets/process.rb +0 -2
  262. data/lib/core/facets/range.rb +4 -4
  263. data/lib/core/facets/range/op_add.rb +15 -0
  264. data/lib/core/facets/range/op_sub.rb +45 -0
  265. data/lib/core/facets/range/{to_r.rb → to_rng.rb} +1 -1
  266. data/lib/core/facets/regexp.rb +0 -2
  267. data/lib/core/facets/regexp/to_proc.rb +13 -0
  268. data/lib/core/facets/string.rb +8 -9
  269. data/lib/core/facets/string/ascii_only.rb +52 -0
  270. data/lib/core/facets/string/each_match.rb +1 -0
  271. data/lib/core/facets/string/ends_with.rb +1 -0
  272. data/lib/core/facets/string/file.rb +6 -20
  273. data/lib/core/facets/string/fold.rb +5 -5
  274. data/lib/core/facets/string/indent.rb +37 -20
  275. data/lib/core/facets/string/indexable.rb +7 -0
  276. data/lib/core/facets/string/interpolate.rb +6 -2
  277. data/lib/core/facets/string/linear.rb +19 -0
  278. data/lib/core/facets/string/margin.rb +47 -19
  279. data/lib/core/facets/string/mscan.rb +3 -0
  280. data/lib/core/facets/string/number.rb +14 -0
  281. data/lib/core/facets/string/op_sub.rb +1 -14
  282. data/lib/core/facets/string/random.rb +34 -0
  283. data/lib/core/facets/string/remove.rb +30 -0
  284. data/lib/core/facets/string/rotate.rb +24 -0
  285. data/lib/core/facets/string/similarity.rb +2 -2
  286. data/lib/core/facets/string/starts_with.rb +5 -0
  287. data/lib/core/facets/string/tab.rb +2 -17
  288. data/lib/core/facets/string/tabto.rb +2 -19
  289. data/lib/core/facets/string/to_rx.rb +1 -0
  290. data/lib/core/facets/string/trim.rb +45 -0
  291. data/lib/core/facets/string/unfold.rb +7 -2
  292. data/lib/core/facets/struct.rb +1 -2
  293. data/lib/core/facets/struct/replace.rb +8 -0
  294. data/lib/core/facets/symbol.rb +1 -3
  295. data/lib/core/facets/symbol/as_s.rb +3 -1
  296. data/lib/core/facets/symbol/call.rb +29 -0
  297. data/lib/core/facets/symbol/thrown.rb +9 -5
  298. data/lib/core/facets/time.rb +0 -2
  299. data/lib/core/facets/time/future.rb +6 -4
  300. data/lib/core/facets/unboundmethod.rb +0 -3
  301. data/lib/core/facets/version.rb +5 -5
  302. data/lib/standard/facets/against.rb +53 -0
  303. data/lib/standard/facets/binding/block_exec.rb +44 -0
  304. data/lib/standard/facets/cgi.rb +2 -40
  305. data/lib/standard/facets/cgi/esc.rb +11 -0
  306. data/lib/standard/facets/cgi/escape_html.rb +63 -0
  307. data/lib/standard/facets/cgi/marshal.rb +20 -0
  308. data/lib/standard/facets/cli.rb +54 -0
  309. data/lib/standard/facets/cloneable.rb +12 -9
  310. data/lib/standard/facets/enumargs.rb +159 -168
  311. data/lib/standard/facets/find.rb +1 -15
  312. data/lib/standard/facets/find/select.rb +16 -0
  313. data/lib/standard/facets/gem/search.rb +18 -0
  314. data/lib/standard/facets/gem/specification/current_specs.rb +21 -0
  315. data/lib/standard/facets/gem/specification/find_requireable_file.rb +21 -0
  316. data/lib/standard/facets/hash_builder.rb +46 -0
  317. data/lib/standard/facets/load_monitor.rb +26 -0
  318. data/lib/standard/facets/math.rb +57 -57
  319. data/lib/standard/facets/math/acosec.rb +1 -0
  320. data/lib/standard/facets/math/acsc.rb +6 -1
  321. data/lib/standard/facets/math/beta.rb +8 -3
  322. data/lib/standard/facets/math/cosec.rb +1 -0
  323. data/lib/standard/facets/math/cosech.rb +1 -0
  324. data/lib/standard/facets/math/csc.rb +6 -1
  325. data/lib/standard/facets/math/csch.rb +6 -1
  326. data/lib/standard/facets/math/distance.rb +19 -0
  327. data/lib/standard/facets/math/ec.rb +5 -0
  328. data/lib/standard/facets/math/lgamma.rb +21 -21
  329. data/lib/standard/facets/math/lngamma.rb +18 -0
  330. data/lib/standard/facets/math/pow.rb +6 -1
  331. data/lib/standard/facets/math/root.rb +1 -1
  332. data/lib/standard/facets/math/sign.rb +15 -4
  333. data/lib/standard/facets/math/tau.rb +5 -0
  334. data/lib/standard/facets/math/tgamma.rb +1 -1
  335. data/lib/standard/facets/memoizer.rb +63 -0
  336. data/lib/standard/facets/ostruct.rb +37 -156
  337. data/lib/standard/facets/ostruct/each.rb +11 -0
  338. data/lib/standard/facets/ostruct/initialize.rb +48 -0
  339. data/lib/standard/facets/ostruct/merge.rb +21 -0
  340. data/lib/standard/facets/ostruct/op_fetch.rb +29 -0
  341. data/lib/standard/facets/ostruct/op_store.rb +1 -0
  342. data/lib/standard/facets/ostruct/to_h.rb +10 -0
  343. data/lib/standard/facets/ostruct/to_ostruct.rb +65 -0
  344. data/lib/standard/facets/pathname.rb +18 -215
  345. data/lib/standard/facets/pathname/chdir.rb +15 -0
  346. data/lib/standard/facets/pathname/empty.rb +10 -0
  347. data/lib/standard/facets/pathname/exists.rb +6 -0
  348. data/lib/standard/facets/pathname/glob.rb +57 -0
  349. data/lib/standard/facets/pathname/home.rb +12 -0
  350. data/lib/standard/facets/pathname/null.rb +20 -0
  351. data/lib/standard/facets/pathname/op_div.rb +15 -0
  352. data/lib/standard/facets/pathname/op_fetch.rb +13 -0
  353. data/lib/standard/facets/pathname/outofdate.rb +13 -0
  354. data/lib/standard/facets/pathname/readline.rb +13 -0
  355. data/lib/standard/facets/pathname/root.rb +10 -0
  356. data/lib/standard/facets/pathname/rootname.rb +10 -0
  357. data/lib/standard/facets/pathname/safe.rb +15 -0
  358. data/lib/standard/facets/pathname/split_root.rb +9 -0
  359. data/lib/standard/facets/pathname/to_path.rb +28 -0
  360. data/lib/standard/facets/pathname/to_str.rb +8 -0
  361. data/lib/standard/facets/pathname/uptodate.rb +11 -0
  362. data/lib/standard/facets/pathname/visit.rb +38 -0
  363. data/lib/standard/facets/pathname/work.rb +10 -0
  364. data/lib/standard/facets/platform.rb +2 -2
  365. data/lib/standard/facets/random.rb +32 -2
  366. data/lib/standard/facets/shellwords.rb +5 -2
  367. data/lib/standard/facets/thread.rb +2 -2
  368. data/lib/standard/facets/uri.rb +7 -178
  369. data/lib/standard/facets/uri/cgi_escape.rb +46 -0
  370. data/lib/standard/facets/uri/cgi_parse.rb +1 -0
  371. data/lib/standard/facets/uri/cgi_unescape.rb +1 -0
  372. data/lib/standard/facets/uri/decode.rb +32 -0
  373. data/lib/standard/facets/uri/parameters.rb +63 -0
  374. data/lib/standard/facets/uri/query.rb +148 -0
  375. data/lib/standard/facets/yaml.rb +3 -56
  376. data/lib/standard/facets/yaml/file.rb +41 -0
  377. data/lib/standard/facets/yaml/kernel.rb +29 -0
  378. data/lib/standard/facets/yaml/read.rb +12 -0
  379. data/test/core/array/test_arrange.rb +37 -0
  380. data/test/core/array/test_each_overlap.rb +31 -0
  381. data/test/core/array/test_intersection.rb +19 -0
  382. data/test/core/array/test_missing.rb +12 -0
  383. data/test/core/array/test_occur.rb +52 -0
  384. data/test/core/array/test_occurrence.rb +20 -0
  385. data/test/core/array/test_reject_values.rb +17 -0
  386. data/test/core/array/test_squeeze.rb +22 -0
  387. data/test/core/array/test_step.rb +28 -0
  388. data/test/core/array/test_unique_permutation.rb +23 -0
  389. data/test/core/enumerable/test_key_by.rb +22 -0
  390. data/test/core/enumerable/test_occur.rb +18 -5
  391. data/test/core/enumerable/test_only.rb +40 -0
  392. data/test/core/enumerable/test_squeeze.rb +35 -0
  393. data/test/core/enumerable/test_sum.rb +8 -3
  394. data/test/core/enumerator/lazy/test_squeeze.rb +33 -0
  395. data/test/core/hash/test_count.rb +10 -1
  396. data/test/core/hash/test_deep_rekey.rb +131 -0
  397. data/test/core/hash/test_each_with_key.rb +16 -0
  398. data/test/core/hash/test_fetch_nested.rb +24 -0
  399. data/test/core/hash/test_keys.rb +0 -11
  400. data/test/core/hash/test_rekey.rb +41 -1
  401. data/test/core/hash/test_revalue.rb +98 -0
  402. data/test/core/hash/test_slice.rb +12 -1
  403. data/test/core/kernel/test_deep_clone.rb +31 -0
  404. data/test/core/kernel/test_deep_copy.rb +2 -28
  405. data/test/core/kernel/test_instance_extract.rb +28 -0
  406. data/test/core/method/test_composition.rb +42 -0
  407. data/test/core/range/test_op_add.rb +24 -0
  408. data/test/core/range/test_op_sub.rb +34 -0
  409. data/test/core/string/test_ascii_only.rb +30 -0
  410. data/test/core/string/test_margin.rb +4 -104
  411. data/test/core/string/test_number.rb +44 -0
  412. data/test/core/string/test_remove.rb +36 -0
  413. data/test/core/string/test_rotate.rb +31 -0
  414. data/test/core/string/test_trim.rb +116 -0
  415. data/test/core/symbol/test_thrown.rb +22 -0
  416. data/test/standard/binding/test_block_exec.rb +21 -0
  417. data/test/standard/math/test_acot.rb +23 -0
  418. data/test/standard/math/test_acoth.rb +22 -0
  419. data/test/standard/math/test_beta.rb +19 -0
  420. data/test/standard/math/test_ceil.rb +22 -0
  421. data/test/standard/math/test_cosec.rb +19 -0
  422. data/test/standard/math/test_cosech.rb +19 -0
  423. data/test/standard/math/test_cot.rb +13 -0
  424. data/test/standard/math/test_coth.rb +13 -0
  425. data/test/standard/math/test_distance.rb +16 -0
  426. data/test/standard/math/test_exp10.rb +14 -0
  427. data/test/standard/math/test_exp2.rb +14 -0
  428. data/test/standard/math/test_factorial.rb +13 -0
  429. data/test/standard/math/test_floor.rb +23 -0
  430. data/test/standard/math/test_gcd.rb +18 -0
  431. data/test/standard/math/test_lcm.rb +13 -0
  432. data/test/standard/math/test_pow.rb +30 -0
  433. data/test/standard/math/test_root.rb +15 -0
  434. data/test/standard/math/test_sec.rb +19 -0
  435. data/test/standard/math/test_sech.rb +19 -0
  436. data/test/standard/math/test_sign.rb +6 -0
  437. data/test/standard/math/test_sinc.rb +15 -0
  438. data/test/standard/math/test_srq.rb +20 -0
  439. data/test/standard/pathname/test_chdir.rb +16 -0
  440. data/test/standard/pathname/test_readline.rb +23 -0
  441. data/test/standard/test_enumargs.rb +1 -1
  442. data/test/standard/test_math.rb +3 -0
  443. data/test/standard/test_ostruct.rb +26 -21
  444. data/test/standard/test_uri.rb +9 -0
  445. metadata +802 -183
  446. data/.ruby +0 -54
  447. data/HISTORY.rdoc +0 -2386
  448. data/lib/core/facets/array/combination.rb +0 -43
  449. data/lib/core/facets/array/index.rb +0 -23
  450. data/lib/core/facets/array/occurent.rb +0 -1
  451. data/lib/core/facets/array/permutation.rb +0 -32
  452. data/lib/core/facets/array/product.rb +0 -30
  453. data/lib/core/facets/array/rotate.rb +0 -48
  454. data/lib/core/facets/array/select.rb +0 -20
  455. data/lib/core/facets/binding/eval.rb +0 -14
  456. data/lib/core/facets/enumerable/count.rb +0 -53
  457. data/lib/core/facets/enumerable/each_with_object.rb +0 -38
  458. data/lib/core/facets/enumerable/group_by.rb +0 -33
  459. data/lib/core/facets/enumerable/none.rb +0 -32
  460. data/lib/core/facets/enumerable/one.rb +0 -39
  461. data/lib/core/facets/enumerable/take.rb +0 -16
  462. data/lib/core/facets/float/round.rb +0 -2
  463. data/lib/core/facets/hash/select.rb +0 -17
  464. data/lib/core/facets/hash/to_h.rb +0 -1
  465. data/lib/core/facets/hash/url_params.rb +0 -21
  466. data/lib/core/facets/instance.rb +0 -157
  467. data/lib/core/facets/integer/even.rb +0 -1
  468. data/lib/core/facets/integer/odd.rb +0 -37
  469. data/lib/core/facets/kernel/__callee__.rb +0 -1
  470. data/lib/core/facets/kernel/__method__.rb +0 -48
  471. data/lib/core/facets/kernel/require_relative.rb +0 -52
  472. data/lib/core/facets/kernel/source_location.rb +0 -13
  473. data/lib/core/facets/nilclass/to_f.rb +0 -17
  474. data/lib/core/facets/numeric/round.rb +0 -69
  475. data/lib/core/facets/numeric/round_at.rb +0 -1
  476. data/lib/core/facets/object/replace.rb +0 -43
  477. data/lib/core/facets/objectspace/reflect.rb +0 -62
  478. data/lib/core/facets/proc/curry.rb +0 -32
  479. data/lib/core/facets/string/bytes.rb +0 -21
  480. data/lib/core/facets/string/each_char.rb +0 -31
  481. data/lib/core/facets/string/end_with.rb +0 -1
  482. data/lib/core/facets/string/lines.rb +0 -19
  483. data/lib/core/facets/string/random_binary.rb +0 -10
  484. data/lib/core/facets/string/start_with.rb +0 -60
  485. data/lib/core/facets/symbol/to_proc.rb +0 -33
  486. data/lib/core/facets/to_hash.rb +0 -336
  487. data/lib/core/facets/unboundmethod/name.rb +0 -28
  488. data/lib/standard/facets/math/gamma.rb +0 -12
  489. data/test/core/array/test_occurent.rb +0 -33
  490. data/test/core/kernel/test_source_location.rb +0 -25
  491. data/test/core/string/test_tabto.rb +0 -16
@@ -0,0 +1,33 @@
1
+ if defined?(Enumerator::Lazy)
2
+ class Enumerator
3
+ class Lazy
4
+
5
+ # Enumerator::Lazy version of Enumerable#squeeze.
6
+ # Note: you must use Ruby 2.0+ or require 'backports'.
7
+ # For now, you have to require 'facets/enumerator/lazy/squeeze' explicitly.
8
+ #
9
+ # Examples
10
+ #
11
+ # [1,2,2,3,3,2,1].lazy.squeeze.to_a #=> [1,2,3,2,1]
12
+ # [1,2,2,3,3,2,1].lazy.squeeze(*[3]).to_a #=> [1,2,2,3,2,1]
13
+ #
14
+ # Returns Enumerator::Lazy.
15
+ #
16
+ # CREDIT: T. Yamada
17
+
18
+ def squeeze(*limited_to)
19
+ first = true
20
+ cur = nil
21
+ self.class.new(self) do |y,v|
22
+ if !limited_to.empty? && !limited_to.include?(v)
23
+ y << v
24
+ elsif first || cur != v
25
+ y << v
26
+ first = false
27
+ cur = v
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,65 @@
1
+ # As suggested by Roger Pack this file is a simple convenience
2
+ # for loading a limited set of *essential* core extensions. By
3
+ # *essential* we mean, more or less, the extensions we think
4
+ # ought to be in Ruby proper anyway.
5
+ #
6
+ # NOTE: This is very much a work in progress! Please feel frre to
7
+ # suggest which extensions you think belong here.
8
+
9
+ require_relative 'functor'
10
+
11
+ ### Kernel
12
+ require_relative 'kernel/blank'
13
+ #require_relative 'kernel/deep_copy'
14
+ #require_relative 'kernel/deep_dup'
15
+ require_relative 'kernel/false'
16
+ require_relative 'kernel/true'
17
+
18
+ ### Object
19
+ require_relative 'object/itself'
20
+
21
+ ### Array
22
+ require_relative 'array/delete_values'
23
+ require_relative 'array/reject_values'
24
+ require_relative 'array/uniq_by'
25
+
26
+ ### Binding
27
+ require_relative 'binding/self'
28
+
29
+ ### Dir
30
+ require_relative 'dir/ascend'
31
+ require_relative 'dir/descend'
32
+ require_relative 'dir/lookup'
33
+
34
+ ### Enumerable
35
+ require_relative 'enumerable/cluster'
36
+ require_relative 'enumerable/graph'
37
+ require_relative 'enumerable/value_by'
38
+
39
+ ### File
40
+ require_relative 'file/write'
41
+
42
+ ### Hash
43
+ require_relative 'hash/autonew'
44
+ require_relative 'hash/compact'
45
+ #require_relative 'hash/data'
46
+ require_relative 'hash/delete_values'
47
+ require_relative 'hash/except'
48
+ require_relative 'hash/rekey'
49
+ require_relative 'hash/revalue'
50
+ require_relative 'hash/slice'
51
+
52
+ ### Proc
53
+ #require_relative 'proc/wrap'
54
+
55
+ ### Regexp
56
+ #require_relative 'regexp/to_proc'
57
+
58
+ ### String
59
+ require_relative 'string/indent'
60
+ require_relative 'string/index_all'
61
+ require_relative 'string/mscan'
62
+ require_relative 'string/trim'
63
+ require_relative 'string/unindent'
64
+ #require_realtive 'string/word_wrap'
65
+
@@ -1,5 +1,3 @@
1
- require 'facets/kernel/require_relative'
2
-
3
1
  require_relative 'exception/detail.rb'
4
2
  require_relative 'exception/raised.rb'
5
3
  require_relative 'exception/suppress.rb'
@@ -0,0 +1,10 @@
1
+ class Exception
2
+
3
+ # See exception message.
4
+ #
5
+ def set_message(string)
6
+ @mesg = string.to_s
7
+ end
8
+
9
+ end
10
+
@@ -1,7 +1,6 @@
1
- require 'facets/kernel/require_relative'
2
-
3
1
  require_relative 'file/append.rb'
4
2
  #require_relative 'file/atomic_write.rb' # uncommon
3
+ require_relative 'file/common_path.rb'
5
4
  require_relative 'file/create.rb'
6
5
  require_relative 'file/ext.rb'
7
6
  require_relative 'file/null.rb'
@@ -0,0 +1,17 @@
1
+ class File
2
+
3
+ # Given an array of path strings, find the longest common prefix path.
4
+ #
5
+ # @author Aaron Gibralter
6
+ def self.common_path(*paths)
7
+ return paths.first if paths.length <= 1
8
+
9
+ arr = paths.sort
10
+ f = arr.first.split('/')
11
+ l = arr.last.split('/')
12
+ i = 0
13
+ i += 1 while f[i] == l[i] && i <= f.length
14
+ f.slice(0, i).join('/')
15
+ end
16
+
17
+ end
@@ -13,7 +13,7 @@ class File
13
13
  # -- this should be fairly robust
14
14
  path_re = Regexp.new('[' + Regexp.escape(File::Separator + %q{\/}) + ']')
15
15
 
16
- head, tail = path.split(path_re, 2)
16
+ head, _ = path.split(path_re, 2)
17
17
  return '.' if path == head
18
18
  return '/' if head.empty?
19
19
  return head
@@ -1,5 +1,3 @@
1
- require 'facets/kernel/require_relative'
2
-
3
1
  require_relative 'filetest/absolute.rb'
4
2
  require_relative 'filetest/contains.rb'
5
3
  require_relative 'filetest/relative.rb'
@@ -13,7 +13,7 @@ module FileTest
13
13
  # The opposite of #absolute?
14
14
  def relative?(path)
15
15
  while r = chop_basename(path.to_s)
16
- path, basename = r
16
+ path, _ = r
17
17
  end
18
18
  path == ''
19
19
  end
@@ -4,17 +4,21 @@ module FileTest
4
4
 
5
5
  module_function
6
6
 
7
- # Is a path considered reasonably "safe"?
8
- #
9
- # Do not mistake this for a perfect solution!
10
- def safe?(path)
11
- case path
12
- when /\A(#{SEPARATOR_PATTERN}|\~)(#{SEPARATOR_PATTERN}|\*)+/
13
- false
14
- else
15
- true
16
- end
7
+ # Is a path considered reasonably "safe"?
8
+ #
9
+ # Do not mistake this for a perfect solution!
10
+ # Please help improve if you know how!
11
+ #
12
+ # Returns [Boolean]
13
+
14
+ def safe?(path)
15
+ case path
16
+ when /\A(#{SEPARATOR_PATTERN}|\~)(#{SEPARATOR_PATTERN}|\*)+/
17
+ false
18
+ else
19
+ true
17
20
  end
21
+ end
18
22
 
19
23
  end
20
24
 
@@ -1,4 +1,2 @@
1
- require 'facets/kernel/require_relative'
2
-
3
- require_relative 'float/round.rb'
1
+ require_relative 'float/round_to.rb'
4
2
 
@@ -0,0 +1 @@
1
+ require 'facets/numeric/round_to'
@@ -1,7 +1,7 @@
1
- # By definition a Functor is simply a first class method, but these are common
2
- # in the form of Method and Proc. So for Ruby a Functor is a more specialized
3
- # as a Higher-order function or Metafunction. Essentally, a Functor can vary
4
- # its behavior accorrding to the operation applied to it.
1
+ # Functor is Ruby's implementation of a Higher-Order-Message. Essentally,
2
+ # a Functor can vary its behavior accorrding to the operation applied to it.
3
+ #
4
+ # Example
5
5
  #
6
6
  # f = Functor.new { |op, x| x.send(op, x) }
7
7
  # (f + 1) #=> 2
@@ -18,7 +18,7 @@ class Functor #< BasicObject
18
18
  # can be used to speed things up.
19
19
  #
20
20
  # The +key+ will always be an array, wich makes it easier
21
- # to cache functor for multiple factors.
21
+ # to cache Functor for multiple factors.
22
22
  #
23
23
  def self.cache(*key, &function)
24
24
  @cache ||= {}
@@ -40,7 +40,7 @@ class Functor #< BasicObject
40
40
  alias :__class__ :class
41
41
 
42
42
  ## If Functor were built-in to Ruby this would not be
43
- ## needed since exceetions could just be added directly.
43
+ ## needed since exceptions could just be added directly.
44
44
  ##$FUNCTOR_EXCEPTIONS ||= [:binding, :undefine_method]
45
45
 
46
46
  ## TODO: This will not work when BasicObject is utilized. How to fix?
@@ -73,7 +73,7 @@ class Functor #< BasicObject
73
73
  end
74
74
 
75
75
  ##def inspect
76
- ## #"#<Functor:#{object_id} #{method_missing(:inspect)}>" # hex id ?
76
+ ## #"#<#{__class__}:#{object_id} #{method_missing(:inspect)}>" # hex id ?
77
77
  ## "#{method_missing(:inspect)}"
78
78
  ##end
79
79
 
@@ -84,11 +84,9 @@ class Functor #< BasicObject
84
84
 
85
85
  private
86
86
 
87
- # Any action against the functor is processesd by the function.
87
+ # Any action against the Functor is processesd by the function.
88
88
  def method_missing(op, *args, &blk)
89
89
  @function.call(op, *args, &blk)
90
90
  end
91
91
 
92
92
  end
93
-
94
- # Copyright (c) 2004 Thomas Sawyer (Ruby License)
@@ -1,12 +1,9 @@
1
- require 'facets/kernel/require_relative'
2
-
3
1
  require_relative 'hash/alias.rb'
4
2
  require_relative 'hash/argumentize.rb'
5
3
  require_relative 'hash/at.rb'
6
4
  require_relative 'hash/autonew.rb'
7
5
  require_relative 'hash/collate.rb'
8
6
  require_relative 'hash/count.rb'
9
- require_relative 'hash/data.rb'
10
7
  require_relative 'hash/dearray_values.rb'
11
8
  require_relative 'hash/deep_merge.rb'
12
9
  require_relative 'hash/delete.rb'
@@ -14,7 +11,9 @@ require_relative 'hash/delete_at.rb'
14
11
  require_relative 'hash/delete_unless.rb'
15
12
  require_relative 'hash/delete_values.rb'
16
13
  require_relative 'hash/diff.rb'
14
+ require_relative 'hash/each_with_key.rb'
17
15
  require_relative 'hash/except.rb'
16
+ require_relative 'hash/fetch_nested.rb'
18
17
  require_relative 'hash/graph.rb'
19
18
  require_relative 'hash/insert.rb'
20
19
  require_relative 'hash/inverse.rb'
@@ -34,13 +33,11 @@ require_relative 'hash/recursively.rb'
34
33
  require_relative 'hash/rekey.rb'
35
34
  require_relative 'hash/replace_each.rb'
36
35
  require_relative 'hash/reverse_merge.rb'
37
- require_relative 'hash/select.rb'
38
36
  require_relative 'hash/slice.rb'
39
37
  require_relative 'hash/stringify_keys.rb'
40
38
  require_relative 'hash/subset.rb'
41
39
  require_relative 'hash/swap.rb'
42
40
  require_relative 'hash/symbolize_keys.rb'
43
- require_relative 'hash/to_h.rb'
44
41
  require_relative 'hash/to_mod.rb'
45
42
  require_relative 'hash/to_options.rb'
46
43
  require_relative 'hash/to_proc.rb'
@@ -6,20 +6,34 @@ class Hash
6
6
  # { :a=>1, :b=>2 }.collate(:a=>3, :b=>4, :c=>5)
7
7
  # #=> { :a=>[1,3], :b=>[2,4], :c=>[5] }
8
8
  #
9
+ # As of v3.0, this method no longer automatically flattens
10
+ # the array values. To acheive the same effect add a flat map.
11
+ #
12
+ # h = { :a=>[1,3], :b=>[2,4], :c=>[5] }.collate(:a=>6, :b=>7, :c=>8)
13
+ # h.each_value{ |v| v.flatten! }
14
+ # #=> { :a=>[1,3,6], :b=>[2,4,7], :c=>[5,8] }
15
+ #
9
16
  # @author Trans (rewrite)
10
17
  # @author Tilo Sloboda (bug fixes)
11
18
  # @author Gavin Kistner (original)
12
19
 
13
- def collate(other)
14
- h = Hash.new
15
- (keys + other.keys).each do |key|
16
- h[key] = []
20
+ def collate(*others)
21
+ h = {}
22
+ keys.each do |k|
23
+ h[k] = []
24
+ end
25
+ others.each do |other|
26
+ other.keys.each do |k|
27
+ h[k] = []
28
+ end
17
29
  end
18
- each do |key, value|
19
- h[key] << value
30
+ each do |k, v|
31
+ h[k] << v
20
32
  end
21
- other.each do |key, value|
22
- h[key] << value
33
+ others.each do |other|
34
+ other.each do |k, v|
35
+ h[k] << v
36
+ end
23
37
  end
24
38
  h.each{ |k,v| v.flatten! }
25
39
  h
@@ -1,11 +1,15 @@
1
1
  class Hash
2
2
 
3
- # Like Enumerable#count, but counts hash values.
3
+ # Like Enumerable#count, but can count hash values.
4
4
  #
5
- # {:A=>1, :B=>1}.count(1) #=> 2
5
+ # {:A=>1, :B=>1}.count(1) #=> 2
6
6
  #
7
- def count(value)
8
- values.count(value)
7
+ def count(*value)
8
+ if value.empty?
9
+ super()
10
+ else
11
+ values.count(*value)
12
+ end
9
13
  end
10
14
 
11
15
  end
@@ -16,9 +16,12 @@ class Hash
16
16
  # h.data.a? #=> true
17
17
  # h.data.d? #=> false
18
18
  #
19
- # TODO: Change name of Hash#data to something better?
19
+ # TODO: Is there a better name for `data` --perhaps `open`?
20
20
  #
21
- # TODO: Is this really a method worth having?
21
+ # TODO: Is this method really worth having?
22
+ #
23
+ # Returns [Functor].
24
+
22
25
  def data
23
26
  this = self
24
27
  Functor.new do |op, *a|
@@ -1,6 +1,6 @@
1
1
  class Hash
2
2
 
3
- # Any array values with be replaced with the first element of the array.
3
+ # Any array values will be replaced with the first element of the array.
4
4
  # Arrays with no elements will be set to nil.
5
5
  #
6
6
  # h = { :a=>[1], :b=>[1,2], :c=>3, :d=>[] }
@@ -0,0 +1,54 @@
1
+ require 'facets/hash/recurse'
2
+ require 'facets/hash/rekey'
3
+
4
+ class Hash
5
+
6
+ # Rekey a hash and all sub-hashes:
7
+ #
8
+ # deep_rekey()
9
+ # deep_rekey(from_key => to_key, ...)
10
+ # deep_rekey{|from_key| to_key}
11
+ # deep_rekey{|from_key, value| to_key}
12
+ #
13
+ # If a key map is given, then the first key is changed to the second key.
14
+ #
15
+ # foo = { :c=>{ :a=>1, :b=>2 } }
16
+ # foo.deep_rekey(:a=>'a') #=> { :c=>{ 'a'=>1, :b=>2 } }
17
+ # foo.deep_rekey(:b=>:x) #=> { :c=>{ :a =>1, :x=>2 } }
18
+ # foo.deep_rekey('foo'=>'bar') #=> { :c=>{ :a =>1, :b=>2 } }
19
+ #
20
+ # If a block is given, converts all keys in the Hash accroding to the
21
+ # given block procedure.
22
+ #
23
+ # foo = { :person=>{ :name=>'Gavin', :wife=>:Lisa } }
24
+ # foo.deep_rekey{ |k| k.to_s } #=> { "person"=>{ "name"=>"Gavin", "wife"=>:Lisa } }
25
+ # foo #=> { "person"=>{ "name"=>"Gavin", "wife"=>:Lisa } }
26
+ #
27
+ # If no key map or block is given, then all keys are converted
28
+ # to Symbols.
29
+ #
30
+ # Raises an ArgumentError if both a +key_map+ and a block are given.
31
+ # If both are needed just call #deep_rekey twice.
32
+ #
33
+ # TODO: If `nil` is returned by block should the key be set to `nil` or the orignal key?
34
+ #
35
+ # CREDIT: Trans, Gavin Kistner, Ryan Duryea
36
+
37
+ def deep_rekey(key_map=nil, &block)
38
+ recurse do |h|
39
+ h.rekey(key_map, &block)
40
+ end
41
+ end
42
+
43
+ # Synonym for Hash#deep_rekey, but modifies the receiver in place (and returns it).
44
+ #
45
+ # foo = { :person=>{ :name=>'Gavin', :wife=>:Lisa } }
46
+ # foo.deep_rekey!{ |k| k.to_s } #=> { "person"=>{ "name"=>"Gavin", "wife"=>:Lisa } }
47
+ # foo #=> { "person"=>{ "name"=>"Gavin", "wife"=>:Lisa } }
48
+ #
49
+ # CREDIT: Trans, Gavin Kistner, Ryan Duryea
50
+
51
+ def deep_rekey!(key_map=nil, &block)
52
+ replace(deep_rekey(key_map, &block))
53
+ end
54
+ end