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,13 @@
1
+ module Enumerable
2
+
3
+ # Map each element into another class via class constructor.
4
+ #
5
+ # @param [#new] to_class
6
+ # Generally a class, but any object that repsonds to #new.
7
+ #
8
+ def map_to(to_class)
9
+ map{ |e| to_class.new(e) }
10
+ end
11
+
12
+ end
13
+
@@ -1 +1,34 @@
1
- require 'facets/enumerable/graph'
1
+ module Enumerable
2
+
3
+ # Like `#map`/`#collect`, but generates a Hash. The block is expected
4
+ # to return two values: the key and the value for the new hash.
5
+ #
6
+ # numbers = (1..3)
7
+ # squares = numbers.mash{ |n| [n, n*n] } # { 1=>1, 2=>4, 3=>9 }
8
+ # sq_roots = numbers.mash{ |n| [n*n, n] } # { 1=>1, 4=>2, 9=>3 }
9
+ #
10
+ # CREDIT: Andrew Dudzik (adudzik), Trans
11
+
12
+ def mash(&yld)
13
+ if yld
14
+ h = {}
15
+ each do |*kv|
16
+ r = yld[*kv]
17
+ case r
18
+ when Hash
19
+ nk, nv = *r.to_a[0]
20
+ when Range
21
+ nk, nv = r.first, r.last
22
+ else
23
+ nk, nv = *r
24
+ end
25
+ h[nk] = nv
26
+ end
27
+ h
28
+ else
29
+ Enumerator.new(self,:graph)
30
+ end
31
+ end
32
+
33
+ end
34
+
@@ -3,24 +3,26 @@ module Enumerable
3
3
  # Returns an array of elements for the elements that occur n times.
4
4
  # Or according to the results of a given block.
5
5
  #
6
- # a = [1,1,2,3,3,4,5,5]
6
+ # a = [1,1,2,3,3,4,5,5]
7
7
  #
8
- # a.occur(1).sort #=> [2,4]
9
- # a.occur(2).sort #=> [1,3,5]
10
- # a.occur(3).sort #=> []
8
+ # a.occur(1).sort #=> [2,4]
9
+ # a.occur(2).sort #=> [1,3,5]
10
+ # a.occur(3).sort #=> []
11
11
  #
12
- # a.occur(1..1).sort #=> [2,4]
13
- # a.occur(2..3).sort #=> [1,3,5]
12
+ # a.occur(1..1).sort #=> [2,4]
13
+ # a.occur(2..3).sort #=> [1,3,5]
14
14
  #
15
- # a.occur { |n| n == 1 }.sort #=> [2,4]
16
- # a.occur { |n| n > 1 }.sort #=> [1,3,5]
15
+ # a.occur { |n| n == 1 }.sort #=> [2,4]
16
+ # a.occur { |n| n > 1 }.sort #=> [1,3,5]
17
17
  #
18
18
  def occur(n=nil) #:yield:
19
19
  result = Hash.new { |hash, key| hash[key] = Array.new }
20
- self.each do |item|
20
+
21
+ each do |item|
21
22
  key = item
22
23
  result[key] << item
23
24
  end
25
+
24
26
  if block_given?
25
27
  result.reject! { |key, values| ! yield(values.size) }
26
28
  else
@@ -31,6 +33,7 @@ module Enumerable
31
33
  result.reject! { |key, values| values.size != n }
32
34
  end
33
35
  end
36
+
34
37
  return result.values.flatten.uniq
35
38
  end
36
39
 
@@ -0,0 +1,56 @@
1
+ module Enumerable
2
+
3
+ # Returns the _only_ element in the enumerable. Raises an IndexError if
4
+ # the enumreable has more then one element.
5
+ #
6
+ # [5].only # => 5
7
+ #
8
+ # expect IndexError do
9
+ # [1,2,3].only
10
+ # end
11
+ #
12
+ # expect IndexError do
13
+ # [].only
14
+ # end
15
+ #
16
+ # CREDIT: Lavir the Whiolet, Gavin Sinclair, Noah Gibbs
17
+ #
18
+ def only
19
+ first = false
20
+ first_item = nil
21
+
22
+ each do |item|
23
+ if first
24
+ raise IndexError, "not the only element of enumerable"
25
+ else
26
+ first = true
27
+ first_item = item
28
+ end
29
+ end
30
+
31
+ if first
32
+ return first_item
33
+ else
34
+ raise IndexError, "not the only element of enumerable"
35
+ end
36
+ end
37
+
38
+ # Does this Enumerable have the only element?
39
+ #
40
+ # It differs from Enumerable#one? in that it does not check the items
41
+ # themselves. It checks the quantity only.
42
+ #
43
+ # CREDIT: Lavir the Whiolet
44
+ #
45
+ def only?
46
+ first = false
47
+
48
+ each do |item|
49
+ return false if first
50
+ first = true
51
+ end
52
+
53
+ return first
54
+ end
55
+
56
+ end
@@ -1,18 +1,19 @@
1
- require 'facets/enumerable/group_by'
2
-
3
1
  module Enumerable
4
2
 
5
3
  # Similar to #group_by but returns an array of the groups.
6
4
  # Returned elements are sorted by block.
7
5
  #
8
- # %w{this is a test}.cluster_by {|x| x[0]}
6
+ # %w{this is a test}.organize_by {|x| x[0]}
9
7
  # #=> [ ['a'], ['is'], ['this', 'test'] ]
10
8
  #
11
9
  # CREDIT: Erik Veenstra
12
10
 
13
- def cluster_by(&b)
11
+ def organize_by(&b)
14
12
  group_by(&b).sort.transpose.pop || [] # group_by(&b).values ?
15
13
  end
16
14
 
15
+ # DEPRECATED: Name changed to avoid confusion with #cluster.
16
+ alias cluster_by organize_by
17
+
17
18
  end
18
19
 
@@ -0,0 +1,20 @@
1
+ module Enumerable
2
+
3
+ # Like `each_slice(2)` but ensures the last
4
+ # element has a pair if odd sized.
5
+ #
6
+ # [:a,1,:b,2,:c,3].pair.to_a #=> [[:a,1],[:b,2],[:c,3]]
7
+ #
8
+ def pair(missing=nil)
9
+ return to_enum(:pair) unless block_given?
10
+
11
+ each_slice(2) do |kv|
12
+ if kv.size == 1
13
+ yield kv.first, missing
14
+ else
15
+ yield kv.first, kv.last
16
+ end
17
+ end
18
+ end
19
+
20
+ end
@@ -1,21 +1,38 @@
1
1
  require 'facets/functor'
2
2
 
3
- #--
4
- # TODO: Consider Enumerator methods.
5
- #++
6
-
7
3
  module Enumerable
8
4
 
5
+ # TODO: Consider Enumerator methods.
6
+
7
+ # TODO: Should Enumerable#pre be moved to functor gem?
8
+
9
+ # TODO: Does the `*y` argument make sense?
10
+
9
11
  # Per element meta-functor.
10
12
  #
11
- # ([1,2,3].per(:map) + 3) #=> [4,5,6]
12
- # ([1,2,3].per(:select) > 1) #=> [2,3]
13
+ # ([1,2,3].per(:map) + 3) #=> [4,5,6]
14
+ # ([1,2,3].per(:select) > 1) #=> [2,3]
13
15
  #
14
16
  # Using fluid notation.
15
17
  #
16
- # ([1,2,3].per.map + 3) #=> [4,5,6]
17
- # ([1,2,3].per.select > 1) #=> [2,3]
18
+ # ([1,2,3].per.map + 3) #=> [4,5,6]
19
+ # ([1,2,3].per.select > 1) #=> [2,3]
18
20
  #
21
+ def per(enum_method=nil, *enum_args)
22
+ if enum_method
23
+ Functor.new do |op, *args, &blk|
24
+ __send__(enum_method || :map, *enum_args){ |x, *y| x.__send__(op, *y, *args, &blk) }
25
+ end
26
+ else
27
+ Functor.new do |enumr_method, *enumr_args|
28
+ Functor.new do |op, *args, &blk|
29
+ __send__(enumr_method, *enumr_args){ |x, *y| x.__send__(op, *y, *args, &blk) }
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ =begin
19
36
  def per(enum_method=nil, *enum_args)
20
37
  if enum_method
21
38
  Permeator.new(self, enum_method, *enum_args)
@@ -50,35 +67,10 @@ module Enumerable
50
67
  end
51
68
 
52
69
  def method_missing(sym, *args, &blk)
53
- @enum_object.__send__(@enum_method){ |x| x.__send__(sym, *args, &blk) }
70
+ #@enum_object.__send__(@enum_method){ |x| x.__send__(sym, *args, &blk) }
71
+ @enum_object.__send__(@enum_method){ |x, *y| x.__send__(sym, *y, *args, &blk) }
54
72
  end
55
73
  end
56
-
57
- ## TODO: Use this when 1.8.6 support is not longer needed.
58
- =begin
59
- # Per element meta-functor.
60
- #
61
- # ([1,2,3].per(:map) + 3) #=> [4,5,6]
62
- # ([1,2,3].per(:select) > 1) #=> [2,3]
63
- #
64
- # Using fluid notation.
65
- #
66
- # ([1,2,3].per.map + 3) #=> [4,5,6]
67
- # ([1,2,3].per.select > 1) #=> [2,3]
68
- #
69
- def per(enum_method=nil, *enum_args)
70
- if enum_method
71
- Functor.new do |op, *args, &blk|
72
- __send__(enum_method, *enum_args){ |x| x.__send__(op, *args, &blk) }
73
- end
74
- else
75
- Functor.new do |enumr_method, *enumr_args|
76
- Functor.new do |op, *args, &blk|
77
- __send__(enumr_method, *enumr_args){ |x| x.__send__(op, *args, &blk) }
78
- end
79
- end
80
- end
81
- end
82
74
  =end
83
75
 
84
76
  end
@@ -9,11 +9,11 @@ module Enumerable
9
9
  end
10
10
 
11
11
  # Recursor is a specialized Functor for recurively iterating over Enumerables.
12
- #--
12
+ #
13
13
  # TODO: Return Enumerator if no +yld+ block is given.
14
14
  #
15
- # TODO: Add limiting +depth+ option to Enumerable#recursively ?
16
- #++
15
+ # TODO: Add limiting +depth+ option to Enumerable#recursively?
16
+ #
17
17
  class Recursor
18
18
  instance_methods(true).each{ |m| private m unless /^(__|object_id$)/ =~ m.to_s }
19
19
 
@@ -0,0 +1,36 @@
1
+ module Enumerable
2
+
3
+ # Squeeze out the same elements. This behaves like C++ unique(),
4
+ # removing equivalent elements that are concomitant to each other.
5
+ # To get a similar result with Array#uniq, the array would have to
6
+ # be sorted first.
7
+ #
8
+ # Calculation order is O(n).
9
+ #
10
+ # Examples
11
+ #
12
+ # [1,2,2,3,3,2,1].squeeze #=> [1,2,3,2,1]
13
+ # [1,2,2,3,3,2,1].sort.squeeze #=> [1,2,3]
14
+ # [1,2,2,3,3,2,1].squeeze(*[3]) #=> [1,2,2,3,2,1]
15
+ #
16
+ # Returns [Array].
17
+ #
18
+ # CREDIT: T. Yamada
19
+
20
+ def squeeze(*limited_to)
21
+ first = true
22
+ r = [] # result
23
+ c = nil # current
24
+ each do |e|
25
+ if !limited_to.empty? && !limited_to.include?(e)
26
+ r << e
27
+ elsif first || c != e
28
+ r << e
29
+ first = false
30
+ c = e
31
+ end
32
+ end
33
+ r
34
+ end
35
+
36
+ end
@@ -2,16 +2,28 @@ module Enumerable
2
2
 
3
3
  # Uses #+ to sum the enumerated elements.
4
4
  #
5
- # [1,2,3].sum #=> 6
6
- # [3,3,3].sum #=> 9
5
+ # [1,2,3].sum #=> 6
6
+ # [3,3,3].sum #=> 9
7
+ # [].sum #=> 0
7
8
  #
8
- # @author Dawid Marcin Grzesiak (bug fix)
9
+ # A initial value can be passed to the method.
10
+ #
11
+ # [].sum(5) #=> 5
12
+ # [1,2,3].sum(10) #=> 16
13
+ #
14
+ # A block can also be passed to coax the elements before summation.
15
+ #
16
+ # [1.1,2.2,3.3].sum(10.4, &:to_i) #=> 16.4
17
+ #
18
+ # Notice the initial value is not effected by the block.
19
+ #
20
+ # @author Dawid Marcin Grzesiak
9
21
 
10
- def sum(identity=0, &block)
22
+ def sum(*identity, &block)
11
23
  if block_given?
12
- map(&block).sum(identity)
24
+ map(&block).sum(*identity)
13
25
  else
14
- inject{ |sum, element| sum + element } || identity
26
+ reduce(*identity) { |sum, element| sum + element }
15
27
  end
16
28
  end
17
29
 
@@ -0,0 +1,23 @@
1
+ module Enumerable
2
+
3
+ # Take an associative array and unassociate it.
4
+ #
5
+ # [[:a,1], [:b,2]].unassociate.to_a #=> [:a, [1], :b, [2]]
6
+ # [[:a,1], [:b,2]].unassociate(1).to_a #=> [:a, 1, :b, 2]
7
+ #
8
+ def unassociate(index = 1..-1)
9
+ return to_enum(:unassociate, index) unless block_given?
10
+
11
+ each do |v|
12
+ case v
13
+ when Array
14
+ yield v[0]
15
+ yield v[index]
16
+ else
17
+ yield v
18
+ yield nil
19
+ end
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,25 @@
1
+ module Enumerable
2
+ # Create a hash whose keys are the enumerable's elements, with specified
3
+ # values.
4
+ #
5
+ # If no block is given, the given parameter (default true) is used for
6
+ # all values, e.g.:
7
+ #
8
+ # [1,2,3].value_by{ true } #=> {1=>true, 2=>true, 3=>true}
9
+ # [1,2,3].value_by{ "a" } #=> {1=>"a", 2=>"a", 3=>"a"}
10
+ #
11
+ # If a block is given, each key's value is the result of running the
12
+ # block for that key, e.g.:
13
+ #
14
+ # [1,2,3].value_by{ |n| "a"*n } #=> {1=>"a", 2=>"aa", 3=>"aaa"}
15
+ #
16
+ # @author Ronen Barzel
17
+ #
18
+ def value_by
19
+ return to_enum(:value_by) unless block_given?
20
+
21
+ h = {}
22
+ each { |item| h[item] = yield(item) }
23
+ h
24
+ end
25
+ end
@@ -1,36 +1,27 @@
1
- # for Ruby 1.8 -> 1.9 transition
2
- unless defined?(::Enumerator)
3
- begin
4
- require 'enumerator'
5
- Enumerator = Enumerable::Enumerator unless defined? ::Enumerator
6
- rescue LoadError # Ruby 1.9 already has it built-in.
7
- end
8
- end
9
-
10
1
  require 'facets/functor'
11
2
 
12
3
  class Enumerator
13
4
 
14
- #
15
- def fx
16
- Functor.new(&method(:fx_send).to_proc)
17
- end
18
-
19
- private
5
+ # TODO: Should Enumerator#fx be moved to functor gem?
20
6
 
21
7
  #
22
- def fx_send(op, *a, &b)
23
- map{ |e| e.send(op, *a, &b) }
8
+ def fx
9
+ Functor.new do |op, *a, &b|
10
+ map{ |e| e.send(op, *a, &b) }
11
+ end
24
12
  end
25
13
 
26
- ## TODO: When no longer needed to support 1.8.6 we can use:
27
- ##
28
- ## #
29
- ## def fx
30
- ## Functor.new do |op, *a, &b|
31
- ## map{ |e| e.send(op, *a, &b) }
32
- ## end
33
- ## end
14
+ # Old 1.8 version (left temporarily for reference)
15
+ #
16
+ # def fx
17
+ # Functor.new(&method(:fx_send).to_proc)
18
+ # end
19
+ #
20
+ # private
21
+ #
22
+ # def fx_send(op, *a, &b)
23
+ # map{ |e| e.send(op, *a, &b) }
24
+ # end
34
25
 
35
26
  end
36
27