facets 2.6.0 → 2.7.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 (321) hide show
  1. data/HISTORY.rdoc +331 -35
  2. data/MANIFEST +685 -826
  3. data/{doc/guide/notes.rd → NOTES} +0 -0
  4. data/README.rdoc +73 -25
  5. data/Rakefile +245 -2
  6. data/TODO +5 -0
  7. data/demo/hook.rd +47 -0
  8. data/demo/scenario_require.rd +9 -0
  9. data/doc/README.more +24 -6
  10. data/doc/manual/about.rb +47 -0
  11. data/doc/manual/annotations.rdoc +60 -0
  12. data/doc/manual/associations.rdoc +55 -0
  13. data/doc/manual/blockups.rdoc +101 -0
  14. data/doc/manual/capsule.rdoc +34 -0
  15. data/doc/manual/command.rdoc +177 -0
  16. data/doc/manual/core.rdoc +37 -0
  17. data/doc/manual/faq.rdoc +32 -0
  18. data/doc/manual/typecast.html +112 -0
  19. data/lib/core/facets.rb +359 -11
  20. data/lib/core/facets/array/combination.rb +3 -3
  21. data/lib/core/facets/array/index.rb +4 -1
  22. data/lib/core/facets/array/permutation.rb +2 -2
  23. data/lib/core/facets/array/product.rb +1 -1
  24. data/lib/core/facets/binding/eval.rb +1 -1
  25. data/lib/core/facets/denumerable.rb +76 -0
  26. data/lib/core/facets/duplicable.rb +34 -0
  27. data/lib/core/facets/enumerable/count.rb +10 -4
  28. data/lib/core/facets/enumerable/defer.rb +77 -0
  29. data/lib/core/facets/enumerable/each_by.rb +1 -1
  30. data/lib/core/facets/enumerable/every.rb +35 -0
  31. data/lib/{more/facets/elementwise.rb → core/facets/enumerable/ewise.rb} +0 -0
  32. data/lib/core/facets/enumerable/filter.rb +25 -0
  33. data/lib/core/facets/enumerable/group_by.rb +1 -1
  34. data/lib/core/facets/enumerable/none.rb +3 -2
  35. data/lib/core/facets/enumerable/one.rb +3 -2
  36. data/lib/core/facets/enumerable/per.rb +61 -0
  37. data/lib/core/facets/exception/raised.rb +14 -0
  38. data/lib/core/facets/integer/odd.rb +5 -1
  39. data/lib/core/facets/kernel/__dir__.rb +13 -3
  40. data/lib/core/facets/kernel/__here__.rb +14 -0
  41. data/lib/core/facets/kernel/__method__.rb +9 -3
  42. data/lib/core/facets/kernel/ask.rb +1 -0
  43. data/lib/core/facets/kernel/equate.rb +13 -0
  44. data/lib/core/facets/kernel/extension.rb +9 -0
  45. data/lib/core/facets/kernel/identical.rb +4 -0
  46. data/lib/core/facets/kernel/instance_exec.rb +2 -1
  47. data/lib/core/facets/kernel/method.rb +49 -0
  48. data/lib/core/facets/kernel/object_send.rb +2 -2
  49. data/lib/core/facets/kernel/{state.rb → object_state.rb} +23 -12
  50. data/lib/core/facets/kernel/require_all.rb +6 -1
  51. data/lib/core/facets/kernel/require_local.rb +8 -1
  52. data/lib/core/facets/kernel/require_relative.rb +52 -0
  53. data/lib/core/facets/kernel/source_location.rb +13 -0
  54. data/lib/core/facets/kernel/tap.rb +13 -6
  55. data/lib/core/facets/module/attr_setter.rb +57 -0
  56. data/lib/core/facets/module/instance_method.rb +24 -0
  57. data/lib/core/facets/module/module_load.rb +60 -44
  58. data/lib/core/facets/module/module_require.rb +1 -0
  59. data/lib/core/facets/nilclass/to_f.rb +1 -1
  60. data/lib/core/facets/objectspace/op_fetch.rb +3 -0
  61. data/lib/core/facets/proc/curry.rb +4 -3
  62. data/lib/core/facets/string/bytes.rb +10 -4
  63. data/lib/core/facets/string/camelcase.rb +6 -5
  64. data/lib/core/facets/string/chars.rb +5 -1
  65. data/lib/core/facets/string/each_char.rb +1 -1
  66. data/lib/core/facets/string/each_word.rb +1 -1
  67. data/lib/core/facets/string/lines.rb +11 -4
  68. data/lib/core/facets/string/start_with.rb +9 -2
  69. data/lib/core/facets/string/unfold.rb +27 -0
  70. data/lib/core/facets/symbol/succ.rb +3 -3
  71. data/lib/core/facets/symbol/thrown.rb +20 -0
  72. data/lib/core/facets/symbol/to_proc.rb +3 -2
  73. data/lib/core/facets/time/to_time.rb +1 -1
  74. data/lib/core/facets/to_hash.rb +41 -100
  75. data/lib/core/facets/unboundmethod/name.rb +20 -23
  76. data/lib/more/facets/ansicode.rb +1 -10
  77. data/lib/more/facets/autoarray.rb +3 -31
  78. data/lib/more/facets/basicobject.rb +73 -0
  79. data/lib/more/facets/blankslate.rb +2 -66
  80. data/lib/{lore → more}/facets/cgi.rb +0 -0
  81. data/lib/more/facets/class_extend.rb +1 -0
  82. data/lib/{lore → more}/facets/continuation.rb +0 -0
  83. data/lib/{lore → more}/facets/date.rb +3 -3
  84. data/lib/more/facets/enumargs.rb +192 -0
  85. data/lib/more/facets/enumerablepass.rb +2 -216
  86. data/lib/more/facets/enumerator.rb +62 -0
  87. data/lib/more/facets/{equatable.rb → equitable.rb} +11 -11
  88. data/lib/more/facets/expirable.rb +13 -41
  89. data/lib/{lore → more}/facets/fileutils.rb +0 -0
  90. data/lib/{lore → more}/facets/fileutils/head.rb +0 -0
  91. data/lib/{lore → more}/facets/fileutils/safe_ln.rb +0 -0
  92. data/lib/{lore → more}/facets/fileutils/slice.rb +0 -0
  93. data/lib/{lore → more}/facets/fileutils/tail.rb +0 -0
  94. data/lib/{lore → more}/facets/fileutils/wc.rb +0 -0
  95. data/lib/{lore → more}/facets/fileutils/whereis.rb +0 -0
  96. data/lib/{lore → more}/facets/fileutils/which.rb +0 -0
  97. data/lib/{lore → more}/facets/getoptlong.rb +0 -0
  98. data/lib/more/facets/hook.rb +2 -29
  99. data/lib/more/facets/inheritor.rb +2 -2
  100. data/lib/more/facets/instance_eval.rb +50 -0
  101. data/lib/more/facets/instance_function.rb +78 -0
  102. data/lib/more/facets/main.rb +20 -15
  103. data/lib/more/facets/memoize.rb +1 -113
  104. data/lib/more/facets/module/attr.rb +83 -0
  105. data/lib/more/facets/module/attr_tester.rb +44 -0
  106. data/lib/more/facets/module/attr_toggler.rb +59 -0
  107. data/lib/more/facets/module/attr_validator.rb +34 -0
  108. data/lib/more/facets/{class_extension.rb → module/class_extend.rb} +21 -13
  109. data/lib/more/facets/once.rb +59 -0
  110. data/lib/more/facets/openmodule.rb +1 -0
  111. data/lib/more/facets/orderedhash.rb +1 -33
  112. data/lib/{lore → more}/facets/ostruct.rb +0 -0
  113. data/lib/more/facets/ostructable.rb +1 -4
  114. data/lib/more/facets/partial.rb +18 -16
  115. data/lib/{lore → more}/facets/pathname.rb +0 -0
  116. data/lib/more/facets/preinitialize.rb +157 -0
  117. data/lib/{lore → more}/facets/rbconfig.rb +0 -0
  118. data/lib/more/facets/recorder.rb +1 -2
  119. data/lib/{lore → more}/facets/set.rb +0 -0
  120. data/lib/{lore → more}/facets/shellwords.rb +0 -0
  121. data/lib/{lore → more}/facets/uri.rb +0 -0
  122. data/lib/{lore → more}/facets/yaml.rb +0 -0
  123. data/lib/{lore → more}/facets/zlib.rb +0 -0
  124. data/meta/loadpath +0 -1
  125. data/meta/sitemap +4 -0
  126. data/meta/version +1 -1
  127. data/test/core/enumerable/test_count.rb +1 -1
  128. data/test/{more/test_filter.rb → core/enumerable/test_defer.rb} +24 -22
  129. data/test/{more/test_elementor.rb → core/enumerable/test_every.rb} +2 -15
  130. data/test/core/enumerable/test_ewise.rb +23 -0
  131. data/test/core/enumerable/test_per.rb +18 -0
  132. data/test/core/enumerable/test_take.rb +13 -0
  133. data/test/core/kernel/test_deepcopy.rb +1 -1
  134. data/test/{more/test_1stclassmethod.rb → core/kernel/test_method.rb} +2 -7
  135. data/test/core/kernel/test_tap.rb +1 -1
  136. data/test/core/proc/test_curry.rb +11 -0
  137. data/test/core/string/test_bytes.rb +1 -1
  138. data/test/core/string/test_camelcase.rb +23 -6
  139. data/test/core/string/test_lines.rb +1 -1
  140. data/test/core/string/test_unfold.rb +14 -0
  141. data/test/{more → core}/test_blank.rb +0 -0
  142. data/test/{more → core}/test_boolean.rb +0 -0
  143. data/test/{more → core}/test_functor.rb +0 -0
  144. data/test/{lore → more}/test_basicobject.rb +0 -0
  145. data/test/more/{test_class_extension.rb → test_class_extend.rb} +6 -6
  146. data/test/{lore → more}/test_continuation.rb +0 -0
  147. data/test/{lore → more}/test_date.rb +0 -0
  148. data/test/more/{test_enumerablepass.rb → test_enumargs.rb} +2 -4
  149. data/test/more/{test_equatable.rb → test_equitable.rb} +2 -2
  150. data/test/more/{test_instantise.rb → test_instance_function.rb} +3 -2
  151. data/test/more/test_memoize.rb +1 -1
  152. data/test/{lore → more}/test_ostruct.rb +0 -0
  153. metadata +865 -1016
  154. data/RELEASE +0 -38
  155. data/doc/README.lore +0 -51
  156. data/doc/log/basic_stats/index.html +0 -39
  157. data/doc/log/changelog.html +0 -648
  158. data/doc/log/changelog.txt +0 -217
  159. data/doc/log/stats/index.html +0 -39
  160. data/doc/log/testlog.txt +0 -278
  161. data/doc/notes/CHANGES +0 -2529
  162. data/doc/rdoc/lore/classes/Array.html +0 -176
  163. data/doc/rdoc/lore/classes/CGI.html +0 -191
  164. data/doc/rdoc/lore/classes/Config.html +0 -135
  165. data/doc/rdoc/lore/classes/Continuation.html +0 -113
  166. data/doc/rdoc/lore/classes/Date.html +0 -631
  167. data/doc/rdoc/lore/classes/DateTime.html +0 -583
  168. data/doc/rdoc/lore/classes/Enumerable.html +0 -89
  169. data/doc/rdoc/lore/classes/Enumerable/Enumerator.html +0 -147
  170. data/doc/rdoc/lore/classes/File.html +0 -128
  171. data/doc/rdoc/lore/classes/FileUtils.html +0 -434
  172. data/doc/rdoc/lore/classes/GetoptLong.html +0 -118
  173. data/doc/rdoc/lore/classes/GetoptLong/DSL.html +0 -208
  174. data/doc/rdoc/lore/classes/Kernel.html +0 -135
  175. data/doc/rdoc/lore/classes/Logger.html +0 -229
  176. data/doc/rdoc/lore/classes/Logger/Ansicolor.html +0 -277
  177. data/doc/rdoc/lore/classes/Logger/LogDevice.html +0 -121
  178. data/doc/rdoc/lore/classes/NilClass.html +0 -119
  179. data/doc/rdoc/lore/classes/OpenStruct.html +0 -432
  180. data/doc/rdoc/lore/classes/Pathname.html +0 -353
  181. data/doc/rdoc/lore/classes/Set.html +0 -117
  182. data/doc/rdoc/lore/classes/Shellwords.html +0 -111
  183. data/doc/rdoc/lore/classes/String.html +0 -140
  184. data/doc/rdoc/lore/classes/Time.html +0 -154
  185. data/doc/rdoc/lore/classes/URI.html +0 -454
  186. data/doc/rdoc/lore/classes/URI/Hash.html +0 -105
  187. data/doc/rdoc/lore/classes/URI/Kernel.html +0 -122
  188. data/doc/rdoc/lore/classes/Zlib.html +0 -188
  189. data/doc/rdoc/lore/created.rid +0 -1
  190. data/doc/rdoc/lore/files/README.html +0 -286
  191. data/doc/rdoc/lore/files/doc/README_lore.html +0 -155
  192. data/doc/rdoc/lore/files/lib/lore/facets/basicobject_rb.html +0 -118
  193. data/doc/rdoc/lore/files/lib/lore/facets/cgi_rb.html +0 -111
  194. data/doc/rdoc/lore/files/lib/lore/facets/continuation_rb.html +0 -147
  195. data/doc/rdoc/lore/files/lib/lore/facets/date_rb.html +0 -97
  196. data/doc/rdoc/lore/files/lib/lore/facets/enumerator_rb.html +0 -111
  197. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/head_rb.html +0 -96
  198. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/safe_ln_rb.html +0 -96
  199. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/slice_rb.html +0 -96
  200. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/tail_rb.html +0 -96
  201. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/wc_rb.html +0 -96
  202. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/whereis_rb.html +0 -96
  203. data/doc/rdoc/lore/files/lib/lore/facets/fileutils/which_rb.html +0 -96
  204. data/doc/rdoc/lore/files/lib/lore/facets/fileutils_rb.html +0 -131
  205. data/doc/rdoc/lore/files/lib/lore/facets/getoptlong_rb.html +0 -135
  206. data/doc/rdoc/lore/files/lib/lore/facets/logger_rb.html +0 -142
  207. data/doc/rdoc/lore/files/lib/lore/facets/ostruct_rb.html +0 -135
  208. data/doc/rdoc/lore/files/lib/lore/facets/pathname_rb.html +0 -145
  209. data/doc/rdoc/lore/files/lib/lore/facets/rbconfig_rb.html +0 -124
  210. data/doc/rdoc/lore/files/lib/lore/facets/set_rb.html +0 -96
  211. data/doc/rdoc/lore/files/lib/lore/facets/shellwords_rb.html +0 -124
  212. data/doc/rdoc/lore/files/lib/lore/facets/uri_rb.html +0 -125
  213. data/doc/rdoc/lore/files/lib/lore/facets/yaml_rb.html +0 -146
  214. data/doc/rdoc/lore/files/lib/lore/facets/zlib_rb.html +0 -97
  215. data/doc/rdoc/lore/fr_class_index.html +0 -73
  216. data/doc/rdoc/lore/fr_file_index.html +0 -71
  217. data/doc/rdoc/lore/fr_method_index.html +0 -177
  218. data/doc/rdoc/lore/index.html +0 -26
  219. data/doc/rdoc/lore/rdoc-style.css +0 -177
  220. data/doc/release-notes/RELEASE-2.0.5 +0 -8
  221. data/doc/release-notes/RELEASE-2.1.0 +0 -9
  222. data/doc/release-notes/RELEASE-2.1.1 +0 -5
  223. data/doc/release-notes/RELEASE-2.1.2 +0 -6
  224. data/doc/release-notes/RELEASE-2.1.3 +0 -5
  225. data/doc/release-notes/RELEASE-2.2.0 +0 -14
  226. data/doc/release-notes/RELEASE-2.2.1 +0 -4
  227. data/doc/release-notes/RELEASE-2.3.0 +0 -6
  228. data/doc/release-notes/RELEASE-2.4.0 +0 -70
  229. data/doc/release-notes/RELEASE-2.4.1 +0 -8
  230. data/doc/release-notes/RELEASE-2.4.2 +0 -4
  231. data/doc/release-notes/RELEASE-2.4.3 +0 -78
  232. data/doc/release-notes/RELEASE-2.4.4 +0 -38
  233. data/doc/release-notes/RELEASE-2.4.5 +0 -37
  234. data/doc/release-notes/RELEASE-2.5.0 +0 -83
  235. data/lib/core/facets/kernel/instance.rb +0 -19
  236. data/lib/lore/facets/basicobject.rb +0 -14
  237. data/lib/lore/facets/enumerator.rb +0 -67
  238. data/lib/lore/facets/logger.rb +0 -291
  239. data/lib/more/facets/1stclassmethod.rb +0 -140
  240. data/lib/more/facets/advisable.rb +0 -162
  241. data/lib/more/facets/association.rb +0 -210
  242. data/lib/more/facets/attr.rb +0 -209
  243. data/lib/more/facets/basex.rb +0 -37
  244. data/lib/more/facets/bbcode.rb +0 -397
  245. data/lib/more/facets/bicrypt.rb +0 -265
  246. data/lib/more/facets/binreadable.rb +0 -221
  247. data/lib/more/facets/censor.rb +0 -97
  248. data/lib/more/facets/classmethods.rb +0 -199
  249. data/lib/more/facets/consoleutils.rb +0 -99
  250. data/lib/more/facets/crypt.rb +0 -166
  251. data/lib/more/facets/dependency.rb +0 -151
  252. data/lib/more/facets/downloader.rb +0 -281
  253. data/lib/more/facets/duplicable.rb +0 -43
  254. data/lib/more/facets/elementor.rb +0 -133
  255. data/lib/more/facets/filter.rb +0 -121
  256. data/lib/more/facets/heap.rb +0 -22
  257. data/lib/more/facets/infinity.rb +0 -193
  258. data/lib/more/facets/ini.rb +0 -264
  259. data/lib/more/facets/instantise.rb +0 -1
  260. data/lib/more/facets/instantize.rb +0 -95
  261. data/lib/more/facets/interval.rb +0 -282
  262. data/lib/more/facets/iteration.rb +0 -65
  263. data/lib/more/facets/linkedlist.rb +0 -222
  264. data/lib/more/facets/lrucache.rb +0 -157
  265. data/lib/more/facets/matcher.rb +0 -140
  266. data/lib/more/facets/memoizer.rb +0 -74
  267. data/lib/more/facets/minitar.rb +0 -1063
  268. data/lib/more/facets/nackclass.rb +0 -41
  269. data/lib/more/facets/net/smtp_tls.rb +0 -131
  270. data/lib/more/facets/nilstatus.rb +0 -48
  271. data/lib/more/facets/overload.rb +0 -94
  272. data/lib/more/facets/paramix.rb +0 -202
  273. data/lib/more/facets/pool.rb +0 -91
  274. data/lib/more/facets/pqueue.rb +0 -449
  275. data/lib/more/facets/pry.rb +0 -32
  276. data/lib/more/facets/reflection.rb +0 -145
  277. data/lib/more/facets/semaphore.rb +0 -92
  278. data/lib/more/facets/settings.rb +0 -248
  279. data/lib/more/facets/snapshot.rb +0 -209
  280. data/lib/more/facets/sparse_array.rb +0 -809
  281. data/lib/more/facets/string/mask.rb +0 -278
  282. data/lib/more/facets/string/obfuscate.rb +0 -65
  283. data/lib/more/facets/string/stylize.rb +0 -169
  284. data/lib/more/facets/string/words.rb +0 -167
  285. data/lib/more/facets/syncarray.rb +0 -114
  286. data/lib/more/facets/synchash.rb +0 -157
  287. data/lib/more/facets/typecast.rb +0 -261
  288. data/lib/more/facets/uninheritable.rb +0 -50
  289. data/lib/more/facets/xmlhash.rb +0 -112
  290. data/lib/more/facets/xoxo.rb +0 -259
  291. data/lib/more/facets/ziputils.rb +0 -490
  292. data/task/conflicts +0 -63
  293. data/task/coverage.rake +0 -37
  294. data/task/methods +0 -49
  295. data/task/rdoc.rake +0 -17
  296. data/task/setup.rake +0 -38
  297. data/task/test.rake +0 -145
  298. data/test/more/test_advisable.rb +0 -71
  299. data/test/more/test_association.rb +0 -38
  300. data/test/more/test_bbcode.rb +0 -21
  301. data/test/more/test_binreadable.rb +0 -50
  302. data/test/more/test_buildable.rb +0 -73
  303. data/test/more/test_classmethods.rb +0 -56
  304. data/test/more/test_crypt.rb +0 -32
  305. data/test/more/test_dependency.rb +0 -69
  306. data/test/more/test_elementwise.rb +0 -25
  307. data/test/more/test_infinity.rb +0 -40
  308. data/test/more/test_interval.rb +0 -151
  309. data/test/more/test_linkedlist.rb +0 -41
  310. data/test/more/test_lrucache.rb +0 -14
  311. data/test/more/test_overload.rb +0 -160
  312. data/test/more/test_paramix.rb +0 -170
  313. data/test/more/test_prototype.rb +0 -35
  314. data/test/more/test_snapshot.rb +0 -21
  315. data/test/more/test_sparsearray.rb +0 -279
  316. data/test/more/test_syncarray.rb +0 -15
  317. data/test/more/test_synchash.rb +0 -16
  318. data/test/more/test_typecast.rb +0 -54
  319. data/test/more/test_uninheritable.rb +0 -31
  320. data/test/more/test_xoxo.rb +0 -274
  321. data/test/test_facets.rb +0 -9
@@ -1,133 +0,0 @@
1
- # = Elementor
2
- #
3
- # Provides elementwise functionality.
4
- #
5
- # == Authors
6
- #
7
- # * Thomas Sawyer
8
- # * George Moschovitis
9
- # * Martin DeMello
10
- #
11
- # == Notes
12
- #
13
- # * This could have been impemented with a generic Functor, rather than
14
- # the specialized Elementor, but for the fact Procs can not yet
15
- # handle blocks.
16
- # * There used to be a "Cascading Elementor", but that proved idiotic
17
- # in the face of adding an instance_eval block to #every.
18
- # * Any ideas for a better name for #accumulate? --gmosx
19
- # * The use of every! and it's relation to Enumerator still seems a bit
20
- # off beat. Should #every always use #map? And another method #each?
21
- #
22
- # == Copying
23
- #
24
- # Copyright (c) 2006 Thomas Sawyer
25
- #
26
- # Ruby License
27
- #
28
- # This module is free software. You may use, modify, and/or redistribute this
29
- # software under the same terms as Ruby.
30
- #
31
- # This program is distributed in the hope that it will be useful, but WITHOUT
32
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
33
- # FOR A PARTICULAR PURPOSE.
34
-
35
- require 'enumerator'
36
- require 'facets/functor'
37
-
38
- module Enumerable
39
-
40
- # Create Elementor.
41
-
42
- def to_elem(meth=nil)
43
- Elementor.new(self, meth || :map)
44
- end
45
-
46
- def per
47
- @__per__ ||= Functor.new do |op|
48
- Elementor.new(self, op)
49
- end
50
- end
51
-
52
- # Returns an elemental object. This allows
53
- # you to map a method on to every element.
54
- #
55
- # r = [1,2,3].every + 3 #=> [4,5,6]
56
-
57
- def every
58
- @_every ||= to_elem
59
- end
60
-
61
- # In place version of #every.
62
-
63
- def every!
64
- raise NoMethodError unless respond_to?(:map!)
65
- @_every_inplace ||= to_elem(:map!)
66
- end
67
-
68
- #def every
69
- # @_every ||= Functor.new do |op,*args|
70
- # map{ |a| a.send(op,*args) }
71
- # end
72
- #end
73
-
74
- #def every!
75
- # raise NoMethodError unless respond_to?(:map!)
76
- # @_every_inplace ||= Functor.new do |op,*args|
77
- # map!{ |a| a.send(op,*args) }
78
- # end
79
- #end
80
-
81
- # Possible name change for every.
82
- #
83
- # r = [1,2,3].elements + 3 #=> [4,5,6]
84
- #
85
- # Certainly reads better.
86
-
87
- alias_method :elements, :every
88
- alias_method :elements!, :every!
89
-
90
- end
91
-
92
-
93
- # = Elementor
94
- #
95
- # Elementor is a type of Functor. Operations
96
- # applied to it are routed to each element.
97
-
98
- class Enumerable::Elementor
99
- private(*instance_methods.select{|x| x !~ /^__/ })
100
-
101
- def initialize(elem_object, elem_method=nil)
102
- @elem_object = elem_object
103
- @elem_method = elem_method || :map
104
- end
105
-
106
- def instance_delegate
107
- @elem_object
108
- end
109
-
110
- def instance_operator
111
- @elem_method
112
- end
113
-
114
- def method_missing(sym,*args,&blk)
115
- @elem_object.__send__(@elem_method){ |x| x.__send__(sym,*args,&blk) }
116
- end
117
- end
118
-
119
-
120
- class Enumerable::Enumerator
121
-
122
- # Create Elementor.
123
-
124
- def to_elem(meth=nil)
125
- Elementor.new(self, meth || :each)
126
- end
127
-
128
- # Enumerator doesn't support inplace element operations, per se.
129
-
130
- undef_method :every!
131
- undef_method :elements!
132
- end
133
-
@@ -1,121 +0,0 @@
1
- require 'facets/enumerable/take'
2
- require 'facets/enumerator'
3
-
4
- module Enumerable
5
-
6
- # Without a block: wrap the Enumerable object in such a way that map,
7
- # select and similar operations are performed "horizontally" across a
8
- # series of blocks, instead of building an array of results at each step.
9
- # This reduces memory usage, allows partial results to be provided
10
- # early, and permits working with infinite series.
11
- #
12
- # (1..1_000_000_000).filter.select{ |i| i % 2 == 0 }.
13
- # map{ |i| i + 100 }.
14
- # take(10).to_a
15
- #
16
- # With a block: the block acts as an arbitrary filter on the data. Unlike
17
- # map, it can choose to drop elements from the result, and/or add
18
- # additional ones. The first object passed to the block is the receiver
19
- # of the output.
20
- #
21
- # (1..1_000_000_000).
22
- # filter { |out,i| out << i if i % 2 == 0 }. # like select
23
- # filter { |out,i| out << i + 100 }. # like map
24
- # take(10).each { |i| puts i }
25
- #
26
- # Use a method like to_a or to_h at the end of the chain if you want an
27
- # Array or Hash built with the results, or each { ... } if you just want
28
- # to output each result and discard it.
29
- #
30
- def filter(&blk)
31
- if block_given?
32
- Enumerator::Filter.new do |output|
33
- each do |*input|
34
- yield output, *input
35
- end
36
- end
37
- else
38
- Enumerator::Filter.new do |output|
39
- each do |*input|
40
- output.yield *input
41
- end
42
- end
43
- end
44
- end
45
-
46
- # = Filterable
47
- #
48
- # Classes which include Enumerable::Filterable will get versions
49
- # of map, select etc. which return a Filter, so that they work
50
- # horizontally without creating intermediate arrays.
51
- #
52
- module Filterable
53
- def map
54
- Enumerator::Filter.new do |output|
55
- each do |*input|
56
- output.yield yield(*input)
57
- end
58
- end
59
- end
60
- alias :collect :map
61
-
62
- def select
63
- Enumerator::Filter.new do |output|
64
- each do |*input|
65
- output.yield(*input) if yield(*input)
66
- end
67
- end
68
- end
69
- alias :find_all :select
70
-
71
- def reject
72
- Enumerator::Filter.new do |output|
73
- each do |*input|
74
- output.yield(*input) unless yield(*input)
75
- end
76
- end
77
- end
78
-
79
- # Limit to the first n items in the list
80
-
81
- def take(n)
82
- Enumerator::Filter.new do |output|
83
- count = 0
84
- each do |*input|
85
- break if count >= n
86
- output.yield(*input)
87
- count += 1
88
- end
89
- end
90
- end
91
-
92
- # Skip the first n items in the list
93
-
94
- def skip(n)
95
- Enumerator::Filter.new do |output|
96
- count = 0
97
- each do |*input|
98
- output.yield(*input) if count >= n
99
- count += 1
100
- end
101
- end
102
- end
103
-
104
- # TODO: add more methods, e.g. grep, take_while etc.
105
- end
106
-
107
- end # module Enumerable
108
-
109
-
110
- class Enumerator
111
-
112
- # = Enumerator::Filter
113
- #
114
- # A class like Enumerator, but which has 'lazy' versions of map, select etc.
115
- #
116
- class Filter < Enumerator
117
- include Enumerable::Filterable
118
- end
119
-
120
- end
121
-
@@ -1,22 +0,0 @@
1
- # = Heap
2
- #
3
- # Another name for PQueue.
4
- #
5
- # == Copying
6
- #
7
- # Copyright (c) 2005 Thomas Sawyer, George Moschovitis
8
- #
9
- # Ruby License
10
- #
11
- # This module is free software. You may use, modify, and/or redistribute this
12
- # software under the same terms as Ruby.
13
- #
14
- # This program is distributed in the hope that it will be useful, but WITHOUT
15
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16
- # FOR A PARTICULAR PURPOSE.
17
-
18
- require 'facets/pqueue'
19
-
20
- # Heap is PQueue.
21
- Heap = PQueue
22
-
@@ -1,193 +0,0 @@
1
- # = Infinity
2
- #
3
- # A full featured Infinity class, supporting signed direction.
4
- # Inifinty is a multiton based on direction The constant INFINITY
5
- # is provided as the common case with direction=+1 (positive).
6
- #
7
- # Besides being an class, these four constants are preset:
8
- #
9
- # NaN
10
- # Inf
11
- # PosInf
12
- # NegInf
13
- #
14
- # These four constants a built from two other basic constants:
15
- #
16
- # UNDEFINED
17
- # INFINITY
18
- #
19
- # In physical memory there are actually only three objects, namely
20
- # three instances of InfinityClass, one for NaN, PosInf and NegInf,
21
- # respectively.
22
- #
23
- # == Copying
24
- #
25
- # Copyright (c) 2004 Thomas Sawyer
26
- #
27
- # Ruby License
28
- #
29
- # This module is free software. You may use, modify, and/or redistribute this
30
- # software under the same terms as Ruby.
31
- #
32
- # This program is distributed in the hope that it will be useful, but WITHOUT
33
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
34
- # FOR A PARTICULAR PURPOSE.
35
- #
36
- # == Authors
37
- #
38
- # * Thomas Sawyer
39
- #
40
- # == Todo
41
- #
42
- # * Could @direction values greater than 1 support Aleph?
43
-
44
- require 'facets/multiton'
45
-
46
- # = Infinity
47
- #
48
- # A full featured Infinity class, supporting signed direction.
49
- # Inifinty is a multiton based on direction The constant INFINITY
50
- # is provided as the common case with direction=+1 (positive).
51
- #
52
- # Besides being an class, these four constants are preset:
53
- #
54
- # NaN
55
- # Inf
56
- # PosInf
57
- # NegInf
58
- #
59
- # These four constants a built from two other basic constants:
60
- #
61
- # UNDEFINED
62
- # INFINITY
63
- #
64
- # In physical memory there are actually only three objects, namely
65
- # three instances of InfinityClass, one for NaN, PosInf and NegInf,
66
- # respectively.
67
- #
68
- class InfinityClass < Numeric
69
- include Multiton
70
-
71
- attr_reader :direction
72
-
73
- def initialize(direction=1)
74
- @direction = (direction <=> 0)
75
- super()
76
- end
77
-
78
- # Change direction of infinity.
79
-
80
- def -@
81
- case @direction
82
- when 0 : self.class.instance(0)
83
- when 1 : self.class.instance(-1)
84
- when -1 : self.class.instance(1)
85
- end
86
- end
87
-
88
- # Noop.
89
-
90
- def +@
91
- self
92
- end
93
-
94
- # Convert to the float version of infinity.
95
-
96
- def to_f
97
- (1.0/0) * @direction
98
- end
99
-
100
- # Gee, a real infinite loop!
101
-
102
- def times
103
- loop do yield end
104
- end
105
-
106
- # Coerce allows other numbers to be
107
- # compared to infinity.
108
-
109
- def coerce(other)
110
- case other
111
- when InfinityClass
112
- super
113
- else
114
- return -self, other
115
- end
116
- end
117
-
118
- # Equality. Note that NaN != NaN.
119
-
120
- def ==(other)
121
- case other
122
- when InfinityClass
123
- if @direction == 0 and other.direction == 0
124
- false
125
- else
126
- super
127
- end
128
- else
129
- false
130
- end
131
- end
132
-
133
- # Comparision where infinity is alway greatest
134
- # and negative infinityalways least.
135
-
136
- def <=>(other)
137
- case other
138
- when InfinityClass
139
- @direction <=> other.direction
140
- else
141
- @direction
142
- end
143
- end
144
-
145
- #
146
-
147
- def to_s
148
- case @direction
149
- when 0 : "NaN"
150
- when 1 : "PosInf"
151
- when -1 : "NegInf"
152
- end
153
- end
154
-
155
- end
156
-
157
- #
158
-
159
- class Numeric
160
-
161
- def finite?
162
- not InfinityClass === self
163
- end
164
-
165
- def infinite?
166
- return false if NaN == self
167
- InfinityClass === self
168
- end
169
- alias :inf? :infinite?
170
-
171
- def nan?
172
- NaN == self
173
- end
174
-
175
- def posinf?
176
- PosInf == self
177
- end
178
-
179
- def neginf?
180
- NegInf == self
181
- end
182
-
183
- end
184
-
185
- # Set constant to positive infinity.
186
- UNDEFINED = InfinityClass.new(0)
187
- INFINITY = InfinityClass.new(1)
188
-
189
- NaN = UNDEFINED
190
- Inf = INFINITY
191
- PosInf = +INFINITY
192
- NegInf = -INFINITY
193
-