facets 2.1.3 → 2.2.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 (303) hide show
  1. data/AUTHORS +14 -12
  2. data/CHANGES +45 -2
  3. data/NOTES +9 -7
  4. data/lib/core/facets/1stclassmethod.rb +15 -11
  5. data/lib/core/facets/array.rb +0 -1
  6. data/lib/core/facets/array/conjoin.rb +40 -8
  7. data/lib/core/facets/array/delete.rb +8 -2
  8. data/lib/core/facets/array/indexable.rb +30 -3
  9. data/lib/core/facets/array/merge.rb +11 -0
  10. data/lib/core/facets/array/only.rb +3 -3
  11. data/lib/core/facets/array/pad.rb +4 -46
  12. data/lib/core/facets/array/rotate.rb +4 -4
  13. data/lib/core/facets/array/select.rb +2 -0
  14. data/lib/core/facets/array/splice.rb +16 -2
  15. data/lib/core/facets/array/stackable.rb +6 -40
  16. data/lib/core/facets/binding.rb +3 -0
  17. data/lib/core/facets/binding/cflow.rb +10 -64
  18. data/lib/core/facets/binding/defined.rb +10 -0
  19. data/lib/core/facets/binding/eval.rb +10 -76
  20. data/lib/core/facets/binding/here.rb +9 -0
  21. data/lib/core/facets/binding/self.rb +10 -0
  22. data/lib/core/facets/binding/vars.rb +0 -45
  23. data/lib/core/facets/boolean.rb +31 -103
  24. data/lib/core/facets/class/descendents.rb +17 -44
  25. data/lib/core/facets/comparable/bound.rb +8 -70
  26. data/lib/core/facets/comparable/cmp.rb +12 -92
  27. data/lib/core/facets/conversion.rb +122 -321
  28. data/lib/core/facets/dir/multiglob.rb +0 -13
  29. data/lib/core/facets/dir/traverse.rb +61 -111
  30. data/lib/core/facets/enumerable.rb +4 -2
  31. data/lib/core/facets/enumerable/cartesian.rb +36 -85
  32. data/lib/core/facets/enumerable/collect.rb +64 -152
  33. data/lib/core/facets/enumerable/combination.rb +40 -42
  34. data/lib/core/facets/enumerable/count.rb +99 -174
  35. data/lib/core/facets/enumerable/each.rb +86 -0
  36. data/lib/core/facets/enumerable/mash.rb +58 -0
  37. data/lib/core/facets/enumerable/permutation.rb +39 -44
  38. data/lib/core/facets/enumerable/probability.rb +16 -90
  39. data/lib/core/facets/enumerable/split.rb +113 -0
  40. data/lib/core/facets/exception/detail.rb +1 -2
  41. data/lib/core/facets/facets.rb +3 -2
  42. data/lib/core/facets/file/read.rb +4 -59
  43. data/lib/core/facets/file/topath.rb +8 -96
  44. data/lib/core/facets/file/write.rb +21 -49
  45. data/lib/core/facets/filetest/root.rb +4 -3
  46. data/lib/core/facets/functor.rb +5 -43
  47. data/lib/core/facets/hash/at.rb +7 -37
  48. data/lib/core/facets/hash/delete.rb +9 -58
  49. data/lib/core/facets/hash/has_keys.rb +4 -43
  50. data/lib/core/facets/hash/insert.rb +5 -38
  51. data/lib/core/facets/hash/inverse.rb +2 -41
  52. data/lib/core/facets/hash/iterate.rb +4 -45
  53. data/lib/core/facets/hash/keyize.rb +24 -92
  54. data/lib/core/facets/hash/merge.rb +4 -38
  55. data/lib/core/facets/hash/new.rb +5 -38
  56. data/lib/core/facets/hash/op.rb +20 -66
  57. data/lib/core/facets/hash/rekey.rb +9 -87
  58. data/lib/core/facets/hash/select.rb +1 -1
  59. data/lib/core/facets/hash/slice.rb +42 -0
  60. data/lib/core/facets/hash/traverse.rb +6 -46
  61. data/lib/core/facets/hash/update.rb +27 -67
  62. data/lib/core/facets/hash/weave.rb +22 -42
  63. data/lib/core/facets/indexable.rb +42 -14
  64. data/lib/core/facets/integer/bitmask.rb +69 -106
  65. data/lib/core/facets/integer/factorial.rb +1 -44
  66. data/lib/core/facets/integer/multiples.rb +27 -22
  67. data/lib/core/facets/integer/of.rb +1 -33
  68. data/lib/core/facets/kernel.rb +4 -2
  69. data/lib/core/facets/kernel/ask.rb +15 -3
  70. data/lib/core/facets/kernel/callstack.rb +38 -69
  71. data/lib/core/facets/kernel/constant.rb +2 -38
  72. data/lib/core/facets/kernel/deepcopy.rb +3 -55
  73. data/lib/core/facets/kernel/dir.rb +2 -0
  74. data/lib/core/facets/kernel/ergo.rb +2 -2
  75. data/lib/core/facets/kernel/instance.rb +51 -120
  76. data/lib/core/facets/kernel/metaid.rb +35 -73
  77. data/lib/core/facets/kernel/object.rb +14 -39
  78. data/lib/core/facets/kernel/op_esc.rb +24 -2
  79. data/lib/core/facets/kernel/populate.rb +6 -69
  80. data/lib/core/facets/kernel/report.rb +28 -33
  81. data/lib/core/facets/kernel/require.rb +7 -21
  82. data/lib/core/facets/kernel/respond.rb +11 -1
  83. data/lib/core/facets/kernel/returning.rb +50 -0
  84. data/lib/core/facets/kernel/silence.rb +12 -24
  85. data/lib/core/facets/kernel/super.rb +12 -76
  86. data/lib/core/facets/kernel/tap.rb +25 -107
  87. data/lib/core/facets/kernel/val.rb +7 -46
  88. data/lib/core/facets/kernel/withattr.rb +6 -64
  89. data/lib/core/facets/matchdata/matchset.rb +8 -50
  90. data/lib/core/facets/module.rb +3 -1
  91. data/lib/core/facets/module/abstract.rb +9 -47
  92. data/lib/core/facets/module/alias.rb +11 -68
  93. data/lib/core/facets/module/attr.rb +36 -15
  94. data/lib/core/facets/module/cattr.rb +8 -76
  95. data/lib/core/facets/module/clone.rb +15 -66
  96. data/lib/core/facets/module/include.rb +54 -114
  97. data/lib/core/facets/module/methods.rb +15 -13
  98. data/lib/core/facets/module/modify.rb +20 -206
  99. data/lib/core/facets/module/name.rb +19 -83
  100. data/lib/core/facets/module/require.rb +48 -53
  101. data/lib/core/facets/module/traits.rb +74 -33
  102. data/lib/core/facets/nilclass/status.rb +25 -2
  103. data/lib/core/facets/numeric/round.rb +24 -89
  104. data/lib/core/facets/proc/bind.rb +16 -59
  105. data/lib/core/facets/proc/compose.rb +6 -40
  106. data/lib/core/facets/proc/fn.rb +2 -0
  107. data/lib/core/facets/range/combine.rb +15 -51
  108. data/lib/core/facets/range/overlap.rb +8 -64
  109. data/lib/core/facets/regexp/arity.rb +6 -41
  110. data/lib/core/facets/stackable.rb +43 -4
  111. data/lib/core/facets/string.rb +2 -0
  112. data/lib/core/facets/string/align.rb +45 -55
  113. data/lib/core/facets/string/blank.rb +2 -46
  114. data/lib/core/facets/string/bracket.rb +14 -87
  115. data/lib/core/facets/string/case.rb +45 -32
  116. data/lib/core/facets/string/crypt.rb +3 -40
  117. data/lib/core/facets/string/filter.rb +7 -49
  118. data/lib/core/facets/string/format.rb +24 -126
  119. data/lib/core/facets/string/indexable.rb +50 -133
  120. data/lib/core/facets/string/interpolate.rb +24 -59
  121. data/lib/core/facets/string/natcmp.rb +5 -39
  122. data/lib/core/facets/string/nchar.rb +37 -45
  123. data/lib/core/facets/string/op.rb +13 -0
  124. data/lib/core/facets/string/partitions.rb +38 -99
  125. data/lib/core/facets/string/range.rb +8 -49
  126. data/lib/core/facets/string/regesc.rb +9 -42
  127. data/lib/core/facets/string/scan.rb +6 -52
  128. data/lib/core/facets/string/splice.rb +8 -13
  129. data/lib/core/facets/string/tabs.rb +16 -153
  130. data/lib/core/facets/symbol.rb +3 -1
  131. data/lib/core/facets/symbol/chomp.rb +11 -29
  132. data/lib/core/facets/symbol/generate.rb +4 -43
  133. data/lib/core/facets/symbol/not.rb +13 -25
  134. data/lib/core/facets/symbol/shadow.rb +2 -40
  135. data/lib/core/facets/symbol/succ.rb +14 -13
  136. data/lib/core/facets/symbol/to_proc.rb +33 -28
  137. data/lib/core/facets/time.rb +1 -0
  138. data/lib/core/facets/time/change.rb +5 -38
  139. data/lib/core/facets/time/elapse.rb +2 -41
  140. data/lib/core/facets/time/stamp.rb +47 -0
  141. data/lib/core/facets/unboundmethod.rb +3 -0
  142. data/lib/core/facets/unboundmethod/arguments.rb +27 -4
  143. data/lib/core/facets/unboundmethod/name.rb +21 -7
  144. data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
  145. data/lib/methods/facets/enumerable/collate.rb +1 -0
  146. data/lib/methods/facets/enumerable/divide.rb +1 -1
  147. data/lib/methods/facets/enumerable/each_by.rb +1 -1
  148. data/lib/methods/facets/enumerable/each_pair.rb +1 -1
  149. data/lib/methods/facets/enumerable/eachn.rb +1 -1
  150. data/lib/methods/facets/enumerable/graph.rb +1 -1
  151. data/lib/methods/facets/enumerable/group_by.rb +1 -1
  152. data/lib/methods/facets/enumerable/inject.rb +1 -0
  153. data/lib/methods/facets/enumerable/map_send.rb +1 -0
  154. data/lib/methods/facets/enumerable/modulate.rb +1 -0
  155. data/lib/methods/facets/enumerable/partition_by.rb +1 -1
  156. data/lib/methods/facets/hash/collate.rb +1 -1
  157. data/lib/methods/facets/hash/except.rb +1 -0
  158. data/lib/methods/facets/hash/graph.rb +1 -1
  159. data/lib/methods/facets/hash/mash.rb +1 -0
  160. data/lib/methods/facets/kernel/Bit.rb +1 -0
  161. data/lib/methods/facets/kernel/complete.rb +1 -1
  162. data/lib/methods/facets/kernel/here.rb +1 -1
  163. data/lib/methods/facets/kernel/non_nil.rb +1 -0
  164. data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
  165. data/lib/methods/facets/kernel/with.rb +1 -1
  166. data/lib/methods/facets/module/class_def.rb +1 -0
  167. data/lib/methods/facets/string/camelcase.rb +1 -0
  168. data/lib/methods/facets/string/op_minus.rb +1 -0
  169. data/lib/methods/facets/string/snakecase.rb +1 -0
  170. data/lib/more/facets/attributes.rb +5 -5
  171. data/lib/more/facets/basicobject.rb +0 -62
  172. data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
  173. data/lib/more/facets/duration.rb +534 -0
  174. data/lib/more/facets/lazy.rb +3 -3
  175. data/lib/more/facets/namespace.rb +23 -71
  176. data/lib/more/facets/rbsystem.rb +42 -8
  177. data/lib/more/facets/stylize.rb +6 -3
  178. data/lib/more/facets/thread.rb +55 -0
  179. data/meta/MANIFEST +49 -18
  180. data/meta/ROLLRC +1 -1
  181. data/meta/project.yaml +2 -2
  182. data/task/install +1 -1
  183. data/task/test/general +8 -2
  184. data/test/unit/array/test_pad.rb +30 -45
  185. data/test/unit/array/test_stackable.rb +14 -28
  186. data/test/unit/binding/test_cflow.rb +34 -49
  187. data/test/unit/binding/test_defined.rb +17 -0
  188. data/test/unit/binding/test_eval.rb +11 -39
  189. data/test/unit/binding/test_here.rb +17 -0
  190. data/test/unit/binding/test_self.rb +17 -0
  191. data/test/unit/binding/test_vars.rb +22 -37
  192. data/test/unit/class/test_descendents.rb +15 -30
  193. data/test/unit/class/test_initializer.rb +1 -8
  194. data/test/unit/comparable/test_bound.rb +38 -53
  195. data/test/unit/comparable/test_cmp.rb +45 -60
  196. data/test/unit/dir/test_traverse.rb +56 -0
  197. data/test/unit/enumerable/test_cartesian.rb +34 -47
  198. data/test/unit/enumerable/test_collect.rb +16 -125
  199. data/test/unit/enumerable/test_combination.rb +1 -8
  200. data/test/unit/enumerable/test_count.rb +51 -66
  201. data/test/unit/enumerable/test_each.rb +77 -0
  202. data/test/unit/enumerable/test_mash.rb +51 -0
  203. data/test/unit/enumerable/test_permutation.rb +1 -7
  204. data/test/unit/enumerable/test_probability.rb +42 -55
  205. data/test/unit/enumerable/test_split.rb +52 -0
  206. data/test/unit/exception/test_detail.rb +19 -0
  207. data/test/unit/file/test_read.rb +34 -0
  208. data/test/unit/file/test_topath.rb +17 -25
  209. data/test/unit/file/test_write.rb +6 -12
  210. data/test/unit/filetest/test_root.rb +14 -0
  211. data/test/unit/hash/test_at.rb +9 -21
  212. data/test/unit/hash/test_delete.rb +22 -37
  213. data/test/unit/hash/test_has_keys.rb +13 -28
  214. data/test/unit/hash/test_insert.rb +9 -23
  215. data/test/unit/hash/test_inverse.rb +11 -26
  216. data/test/unit/hash/test_iterate.rb +16 -31
  217. data/test/unit/hash/test_keyize.rb +40 -55
  218. data/test/unit/hash/test_merge.rb +10 -25
  219. data/test/unit/hash/test_new.rb +9 -24
  220. data/test/unit/hash/test_op.rb +1 -7
  221. data/test/unit/hash/test_rekey.rb +47 -62
  222. data/test/unit/hash/test_traverse.rb +17 -32
  223. data/test/unit/hash/test_update.rb +30 -45
  224. data/test/unit/hash/test_weave.rb +10 -23
  225. data/test/unit/integer/test_bitmask.rb +48 -44
  226. data/test/unit/integer/test_factorial.rb +11 -26
  227. data/test/unit/integer/test_multiples.rb +1 -5
  228. data/test/unit/integer/test_of.rb +14 -29
  229. data/test/unit/kernel/test_callstack.rb +13 -28
  230. data/test/unit/kernel/test_constant.rb +14 -28
  231. data/test/unit/kernel/test_deepcopy.rb +20 -35
  232. data/test/unit/kernel/test_instance.rb +46 -61
  233. data/test/unit/kernel/test_metaid.rb +42 -57
  234. data/test/unit/kernel/test_object.rb +14 -29
  235. data/test/unit/kernel/test_populate.rb +38 -53
  236. data/test/unit/kernel/test_report.rb +1 -7
  237. data/test/unit/kernel/test_returning.rb +16 -0
  238. data/test/unit/kernel/test_silence.rb +8 -23
  239. data/test/unit/kernel/test_super.rb +41 -56
  240. data/test/unit/kernel/test_tap.rb +15 -39
  241. data/test/unit/kernel/test_val.rb +7 -20
  242. data/test/unit/kernel/test_withattr.rb +29 -44
  243. data/test/unit/matchdata/test_matchset.rb +20 -35
  244. data/test/unit/module/test_abstract.rb +15 -30
  245. data/test/unit/module/test_alias.rb +32 -45
  246. data/test/unit/module/test_cattr.rb +39 -54
  247. data/test/unit/module/test_clone.rb +31 -43
  248. data/test/unit/module/test_include.rb +1 -35
  249. data/test/unit/module/test_modify.rb +102 -114
  250. data/test/unit/module/test_name.rb +1 -7
  251. data/test/unit/numeric/test_round.rb +46 -61
  252. data/test/unit/proc/test_bind.rb +29 -44
  253. data/test/unit/proc/test_compose.rb +20 -35
  254. data/test/unit/range/test_combine.rb +14 -29
  255. data/test/unit/range/test_overlap.rb +34 -51
  256. data/test/unit/regexp/test_arity.rb +14 -29
  257. data/test/unit/string/test_align.rb +13 -27
  258. data/test/unit/string/test_blank.rb +12 -27
  259. data/test/unit/string/test_bracket.rb +52 -67
  260. data/test/unit/string/test_case.rb +19 -38
  261. data/test/unit/string/test_crypt.rb +10 -25
  262. data/test/unit/string/test_filter.rb +1 -7
  263. data/test/unit/string/test_format.rb +2 -7
  264. data/test/unit/string/test_indexable.rb +54 -69
  265. data/test/unit/string/test_interpolate.rb +8 -21
  266. data/test/unit/string/test_natcmp.rb +11 -26
  267. data/test/unit/string/test_nchar.rb +1 -14
  268. data/test/unit/string/test_op.rb +14 -0
  269. data/test/unit/string/test_partitions.rb +39 -54
  270. data/test/unit/string/test_range.rb +17 -32
  271. data/test/unit/string/test_regesc.rb +1 -7
  272. data/test/unit/string/test_scan.rb +23 -38
  273. data/test/unit/string/test_stackable.rb +79 -98
  274. data/test/unit/string/test_tabs.rb +1 -7
  275. data/test/unit/symbol/test_chomp.rb +10 -21
  276. data/test/unit/symbol/test_generate.rb +7 -22
  277. data/test/unit/symbol/test_not.rb +10 -25
  278. data/test/unit/symbol/test_shadow.rb +8 -23
  279. data/test/unit/symbol/test_succ.rb +1 -7
  280. data/test/unit/symbol/test_to_proc.rb +1 -7
  281. data/test/unit/test_attributes.rb +1 -1
  282. data/test/unit/test_continuation.rb +13 -0
  283. data/test/unit/test_conversion.rb +1 -14
  284. data/test/unit/test_namespace.rb +30 -3
  285. data/test/unit/test_thread.rb +23 -0
  286. data/test/unit/time/test_change.rb +11 -26
  287. data/test/unit/time/test_elapse.rb +10 -25
  288. data/test/unit/time/test_stamp.rb +28 -0
  289. metadata +65 -25
  290. data/lib/core/facets/array/unzip.rb +0 -14
  291. data/lib/core/facets/continuation.rb +0 -1
  292. data/lib/core/facets/enumerable/collate.rb +0 -104
  293. data/lib/core/facets/kernel/require_esc.rb +0 -44
  294. data/lib/more/facets/mapsend.rb +0 -98
  295. data/lib/more/facets/pp_s.rb +0 -30
  296. data/log/history.rd +0 -38
  297. data/log/todo.rd +0 -4
  298. data/task/special/quickopts +0 -15
  299. data/test/unit/continuation/test_create.rb +0 -28
  300. data/test/unit/enumerable/test_collate.rb +0 -51
  301. data/test/unit/kernel/test_require_esc.rb +0 -29
  302. data/test/unit/test_mapsend.rb +0 -18
  303. data/test/unit/test_pp_s.rb +0 -17
@@ -1,16 +1,3 @@
1
- # TITLE:
2
- #
3
- # Multiglob
4
- #
5
- # SUMMARY:
6
- #
7
- # Dir extensions for globbing multiple locations at once.
8
- #
9
- # CREDITS:
10
- #
11
- # - Thomas Sawyer
12
-
13
- #
14
1
  class Dir
15
2
 
16
3
  # Like +glob+ but can take multiple patterns.
@@ -1,60 +1,40 @@
1
- # TITLE:
2
- #
3
- # Dir Travserse Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # Travsersal extensions for Dir class.
8
- #
9
- # CREDITS:
10
- #
11
- # - Thomas Sawyer
12
- # - Daniel Berger
13
- # - Jeffrey Schwab
14
- # - George Moschovitis
1
+ # TODO:
2
+ # - Make instance method versions.
15
3
 
16
- #
17
4
  class Dir
18
5
 
19
6
  # Is a path parental to another?
20
- #--
21
- # TODO Needs work
22
- #++
23
- def ancestor?(parent_path, child_path)
7
+ #
8
+ # TODO: Needs improvement.
9
+
10
+ def self.ancestor?(parent_path, child_path)
24
11
  %r|^#{Regexp.escape(parent_path)}| =~ child_path
25
12
  end
26
13
 
27
14
  # Is a path parental to another?
28
- #--
29
- # TODO Needs work
30
- #++
31
- def parent?(parent_path, child_path)
32
- %r|^#{Regexp.escape(parent_path)}| =~ child_path
33
- end
15
+ #
16
+ # TODO: Needs improvement.
34
17
 
35
- # Recursively scan a directory and pass each file
36
- # to the given block.
37
- def ls_r(path='.', &block)
38
- list = []
39
- stoplist = ['.', '..']
40
- Dir.foreach(path) do |f|
41
- next if stoplist.include?(f)
42
- filename = path + '/' + f
43
- list << filename
44
- block.call(filename) if block
45
- if FileTest.directory?(filename) and not FileTest.symlink?(filename)
46
- list.concat( Dir.recurse(filename, &block) )
47
- end
48
- end
49
- list
18
+ def self.parent?(parent_path, child_path)
19
+ %r|^#{Regexp.escape(parent_path)}| =~ child_path
50
20
  end
51
21
 
52
- # Alias for Dir#ls_r
53
- alias_method :recurse, :ls_r
54
-
55
22
  # Ascend a directory path.
56
-
57
- def ascend(dir, inclusive=true, &blk)
23
+ #
24
+ # Dir.ascend("/var/log") do |path|
25
+ # p path
26
+ # end
27
+ #
28
+ # _produces_
29
+ #
30
+ # /var/log
31
+ # /var
32
+ # /
33
+ #
34
+ # CREDIT: Daniel Berger
35
+ # CREDIT: Jeffrey Schwab
36
+
37
+ def self.ascend(dir, inclusive=true, &blk)
58
38
  dir = dir.dup
59
39
  blk.call(dir) if inclusive
60
40
  ri = dir.rindex('/')
@@ -69,80 +49,50 @@ class Dir
69
49
  end
70
50
 
71
51
  # Descend a directory path.
72
-
73
- def descend(path) #:yield:
52
+ #
53
+ # Dir.descend("/var/log") do |path|
54
+ # p path
55
+ # end
56
+ #
57
+ # _produces_
58
+ #
59
+ # /
60
+ # /var
61
+ # /var/log
62
+ #
63
+ # CREDIT: Daniel Berger
64
+ # CREDIT: Jeffrey Schwab
65
+
66
+ def self.descend(path) #:yield:
74
67
  paths = path.split('/')
75
68
  paths.size.times do |n|
76
- yield File.join( *paths[0..n] )
69
+ yield File.join(*paths[0..n])
77
70
  end
78
71
  end
79
72
 
80
- end
81
-
82
-
83
- # _____ _
84
- # |_ _|__ ___| |_
85
- # | |/ _ \/ __| __|
86
- # | | __/\__ \ |_
87
- # |_|\___||___/\__|
88
- #
89
- =begin #no test
90
-
91
- require 'test/unit'
92
-
93
- # TODO Need to mockup dir for tests.
94
-
95
- class TestDirNavigate < Test::Unit::TestCase
96
-
97
- def test_ancestor
98
- assert( Dir.ancestor?( "a/b/c", "a/b/c/d" ) )
99
- end
100
-
101
- def test_ls_r
102
- td = Dir.pwd
103
- Dir.chdir $TESTDIR
104
- r = ["A", "A/B","A/B/C.txt", "A/B.txt", "A.txt"].collect{ |e|
105
- File.join( 'ls_r', e )
106
- }
107
- fs = Dir.ls_r( 'ls_r' )
108
- assert_equal( r, fs, Dir.pwd )
109
- Dir.chdir td
110
- end
111
-
112
- def test_recurse
113
- td = Dir.pwd
114
- Dir.chdir $TESTDIR
115
- r = ["A", "A/B","A/B/C.txt", "A/B.txt", "A.txt"].collect{ |e|
116
- File.join( 'ls_r', e )
117
- }
118
- fs = Dir.recurse( 'ls_r' )
119
- assert_equal( r, fs, Dir.pwd )
120
- Dir.chdir td
121
- end
122
-
123
- def test_parent
124
- assert( Dir.ancestor?( "a/b/c", "a/b/c/d" ) )
125
- end
126
-
127
- def test_ascend_01
128
- c = []
129
- Dir.ascend( "this/path/up" ) do |path|
130
- c << path
131
- end
132
- assert_equal( 'this/path/up', c[0] )
133
- assert_equal( 'this/path', c[1] )
134
- assert_equal( 'this', c[2] )
135
- end
73
+ # Recursively scan a directory and pass each file
74
+ # to the given block.
75
+ #
76
+ # CREDIT: George Moschovitis
136
77
 
137
- def test_ascend_02
138
- c = []
139
- Dir.ascend( "this/path/up", false ) do |path|
140
- c << path
78
+ def self.ls_r(path='.', &block)
79
+ list = []
80
+ stoplist = ['.', '..']
81
+ Dir.foreach(path) do |f|
82
+ next if stoplist.include?(f)
83
+ filename = path + '/' + f
84
+ list << filename
85
+ block.call(filename) if block
86
+ if FileTest.directory?(filename) and not FileTest.symlink?(filename)
87
+ list.concat( Dir.recurse(filename, &block) )
141
88
  end
142
- assert_equal( 'this/path', c[0] )
143
- assert_equal( 'this', c[1] )
144
89
  end
90
+ list
91
+ end
145
92
 
93
+ class << self
94
+ # Alias for Dir#ls_r
95
+ alias_method :recurse, :ls_r
146
96
  end
147
97
 
148
- =end
98
+ end
@@ -1,7 +1,9 @@
1
1
  require 'facets/enumerable/cartesian.rb'
2
2
  require 'facets/enumerable/combination.rb'
3
- require 'facets/enumerable/collate.rb'
4
3
  require 'facets/enumerable/collect.rb'
5
- require 'facets/enumerable/permutation.rb'
6
4
  require 'facets/enumerable/count.rb'
5
+ require 'facets/enumerable/each.rb'
6
+ require 'facets/enumerable/mash.rb'
7
+ require 'facets/enumerable/permutation.rb'
7
8
  require 'facets/enumerable/probability.rb'
9
+ require 'facets/enumerable/split.rb'
@@ -1,47 +1,36 @@
1
- # TITLE:
2
- #
3
- # Cartesian
4
- #
5
- # SUMMARY:
6
- #
7
- # Cartesian product and similar methods.
8
- #
9
- # AUTHORS:
10
- #
11
- # - Thomas Hafner
12
-
13
- #
14
1
  module Enumerable
15
2
 
16
- class << self
17
- # Provides the cross-product of two or more Enumerables.
18
- # This is the class-level method. The instance method
19
- # calls on this.
20
- #
21
- # Enumerable.cart([1,2], [4], ["apple", "banana"])
22
- # #=> [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
23
- #
24
- # Enumerable.cart([1,2], [3,4])
25
- # #=> [[1, 3], [1, 4], [2, 3], [2, 4]]
26
-
27
- def cartesian_product(*enums, &block)
28
- result = [[]]
29
- while [] != enums
30
- t, result = result, []
31
- b, *enums = enums
32
- t.each do |a|
33
- b.each do |n|
34
- result << a + [n]
35
- end
3
+ # Provides the cross-product of two or more Enumerables.
4
+ # This is the class-level method. The instance method
5
+ # calls on this.
6
+ #
7
+ # Enumerable.cart([1,2], [4], ["apple", "banana"])
8
+ # #=> [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
9
+ #
10
+ # Enumerable.cart([1,2], [3,4])
11
+ # #=> [[1, 3], [1, 4], [2, 3], [2, 4]]
12
+ #
13
+ # CREDIT: Thomas Hafner
14
+
15
+ def self.cartesian_product(*enums, &block)
16
+ result = [[]]
17
+ while [] != enums
18
+ t, result = result, []
19
+ b, *enums = enums
20
+ t.each do |a|
21
+ b.each do |n|
22
+ result << a + [n]
36
23
  end
37
24
  end
38
- if block_given?
39
- result.each{ |e| block.call(e) }
40
- else
41
- result
42
- end
43
25
  end
26
+ if block_given?
27
+ result.each{ |e| block.call(e) }
28
+ else
29
+ result
30
+ end
31
+ end
44
32
 
33
+ class << self
45
34
  alias_method :cart, :cartesian_product
46
35
  end
47
36
 
@@ -50,18 +39,22 @@ module Enumerable
50
39
  # a = []
51
40
  # [1,2].cart([4,5]){|elem| a << elem }
52
41
  # a #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
42
+ #
43
+ # CREDIT: Thomas Hafner
53
44
 
54
45
  def cartesian_product(*enums, &block)
55
46
  Enumerable.cartesian_product(self, *enums, &block)
56
47
  end
57
48
 
58
- alias :cart :cartesian_product
49
+ alias_method :cart, :cartesian_product
59
50
 
60
51
  # Operator alias for cross-product.
61
52
  #
62
53
  # a = [1,2] ** [4,5]
63
54
  # a #=> [[1, 4],[1, 5],[2, 4],[2, 5]]
64
55
  #
56
+ # CREDIT: Trans
57
+
65
58
  def **(enum)
66
59
  Enumerable.cartesian_product(self, enum)
67
60
  end
@@ -79,6 +72,8 @@ module Enumerable
79
72
  # [1, 2]
80
73
  # [1, 3]
81
74
  #
75
+ # CREDIT: Trans
76
+
82
77
  def each_combo
83
78
  a = collect{ |x|
84
79
  x.respond_to?(:to_a) ? x.to_a : 0..x
@@ -101,6 +96,8 @@ module Enumerable
101
96
 
102
97
  # As with each_combo but returns combos collected in an array.
103
98
  #
99
+ # CREDIT: Trans
100
+
104
101
  def combos
105
102
  a = []
106
103
  each_combo{ |c| a << c }
@@ -108,49 +105,3 @@ module Enumerable
108
105
  end
109
106
 
110
107
  end
111
-
112
-
113
-
114
- # _____ _
115
- # |_ _|__ ___| |_
116
- # | |/ _ \/ __| __|
117
- # | | __/\__ \ |_
118
- # |_|\___||___/\__|
119
- #
120
- =begin test
121
-
122
- require 'test/unit'
123
-
124
- class TestEnumerableClass < Test::Unit::TestCase
125
-
126
- def test_cart_01
127
- i = [[1,2], [3,4]]
128
- o = [[1, 3], [1, 4], [2, 3], [2, 4]]
129
- assert_equal( o, Enumerable.cart(*i) )
130
- end
131
-
132
- def test_cart_02
133
- i = [[1,2], [4], ["apple", "banana"]]
134
- o = [[1, 4, "apple"], [1, 4, "banana"], [2, 4, "apple"], [2, 4, "banana"]]
135
- assert_equal( o, Enumerable.cart(*i) )
136
- end
137
-
138
- def test_cart_03
139
- a = [1,2,3].cart([4,5,6])
140
- assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
141
- end
142
-
143
- def test_cart_04
144
- a = []
145
- [1,2,3].cart([4,5,6]) {|elem| a << elem }
146
- assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
147
- end
148
-
149
- def test_op_pow
150
- a = [1,2,3] ** [4,5,6]
151
- assert_equal( [[1, 4],[1, 5],[1, 6],[2, 4],[2, 5],[2, 6],[3, 4],[3, 5],[3, 6]], a )
152
- end
153
-
154
- end
155
-
156
- =end
@@ -1,48 +1,12 @@
1
- # TITLE:
2
- #
3
- # Collect
4
- #
5
- # DESCRIPTION:
6
- #
7
- # Variations of Enumerable collection and partition methods.
8
- #
9
- # AUTHORS:
10
- #
11
- # - Florian Gross
12
- # - Thomas Sawyer
13
- # - Gavin Sinclair
14
- # - Thibaut Barrère
15
- # - WhyTheLuckyStiff
16
- # - Daniel Sheppard
17
- # - Paul Battley
18
- #
19
- # NOTES:
20
- #
21
- # - TODO Deprecate #group_by when released for Ruby 1.9.
22
- # - TODO Suggest Enumerator's #each_slice use block arity if no parameter is given.
23
-
24
- require 'enumerator' # for each_slice
25
-
26
- #
27
1
  module Enumerable
28
2
 
29
- # Partition an array into parts of given length.
30
- #
31
- # CREDIT WhyTheLuckyStiff
32
-
33
- # def / len
34
- # inject([]) do |ary, x|
35
- # ary << [] if [*ary.last].nitems % len == 0
36
- # ary.last << x
37
- # ary
38
- # end
39
- # end
40
-
41
3
  # Same as #collect but with an iteration counter.
42
4
  #
43
5
  # a = [1,2,3].collect_with_index { |e,i| e*i }
44
6
  # a #=> [0,2,6]
45
7
  #
8
+ # CREDIT: Gavin Sinclair
9
+
46
10
  def collect_with_index
47
11
  r = []
48
12
  each_index do |i|
@@ -51,6 +15,8 @@ module Enumerable
51
15
  r
52
16
  end
53
17
 
18
+ # Alias for collect_with_index.
19
+
54
20
  alias_method :map_with_index, :collect_with_index
55
21
 
56
22
  # Collects/Maps and filters items out in one single step.
@@ -64,6 +30,8 @@ module Enumerable
64
30
  # end
65
31
  #
66
32
  # Also see Enumerable#collect, Enumerable#find_all.
33
+ #
34
+ # CREDIT: Florian Gross
67
35
 
68
36
  def filter_collect #:yield:
69
37
  result = []
@@ -76,6 +44,8 @@ module Enumerable
76
44
  return result
77
45
  end
78
46
 
47
+ # Alias for #filter_collect.
48
+
79
49
  alias_method :filter_map, :filter_collect
80
50
 
81
51
  # Collects/Maps and compacts items in one single step.
@@ -86,6 +56,8 @@ module Enumerable
86
56
  # persons.compact_collect { |person| person.telephone_no }
87
57
  #
88
58
  # Also see Enumerable#collect, Enumerable#map, Array#compact.
59
+ #
60
+ # CREDIT: Florian Gross
89
61
 
90
62
  def compact_collect #:yield:
91
63
  filter_collect do |item|
@@ -95,146 +67,89 @@ module Enumerable
95
67
  end
96
68
  end
97
69
 
70
+ # Alias for #compact_collect.
71
+
98
72
  alias_method :compact_map, :compact_collect
99
73
 
100
- # Say you want to count letters--
101
- #
102
- # some_text.injecting(Hash.new(0)) {|h,l| h[l] += 1}
103
- #
104
- # vs
74
+ # Conditional collect.
105
75
  #
106
- # some_text.inject(Hash.new(0)) {|h,l| h[l] +=1; h}
76
+ # [1,2,3].collect_if { |e| e > 1 }
107
77
  #
108
- # CREDIT Louis J Scoras
78
+ # CREDIT: ? Mauricio Fernandez
109
79
 
110
- def injecting(s)
111
- inject(s) do |k, i|
112
- yield(k, i); k
113
- end
80
+ def collect_if(&b)
81
+ a = map(&b)
82
+ # to get the same semantics as select{|e| e}
83
+ a.delete(false)
84
+ a.compact!
85
+ a
114
86
  end
115
87
 
116
- # TODO Faster implementation? Verify equivalency.
117
- #def injecting(res, &block)
118
- # ([res]*length).zip(to_a).each(&block)
119
- # res
120
- #end
88
+ # Alias for #collect_if.
121
89
 
122
- # The #group_by method is best explained by example.
123
- #
124
- # (1..5).partition_by { |n| n % 3 }
125
- # #=> { 0 => [3], 1 => [1, 4], 2 => [2,5] }
126
- #
127
- # ["I had", 1, "dollar and", 50, "cents"].partition_by { |e| e.class }
128
- # #=> { String => ["I had","dollar and","cents"], Fixnum => [1,50] }
129
- #
130
- # #group_by is used to group items in a collection by something they
131
- # have in common. The common factor is the key in the resulting hash, the
132
- # array of like elements is the value.
90
+ alias_method :map_if, :collect_if
91
+
92
+ # Send a message to each element and collect the result.
133
93
  #
134
- # CREDIT Erik Veenstra
94
+ # CREDIT: Sean O'Halpin
135
95
 
136
- def group_by #:yield:
137
- h = k = e = nil
138
- r = Hash.new
139
- each{ |e| (r[yield(e)] ||= []) << e }
140
- r
96
+ def map_send(meth, *args) #:yield:
97
+ if block_given?
98
+ map{|e| yield(e.send(meth, *args))}
99
+ else
100
+ map{|e| e.send(meth, *args)}
101
+ end
141
102
  end
142
103
 
143
- # This alias is the original Facets name for the method, but Ruby 1.9 has
144
- # adopted #group_by as the name, so eventually #partition_by will be deprecated.
145
- alias_method :partition_by, :group_by
146
-
147
- # Similar to #group_by but returns an array of the groups.
148
- # Returned elements are sorted by block.
104
+ # # Cascade actions on each enumerated element.
105
+ # #
106
+ # # [9, 19, 29].cascade :succ, :to_s, :reverse
107
+ # # => ["01", "02", "03"]
108
+ # #
109
+ # # See ruby-talk:199877.
149
110
  #
150
- # %w{this is a test}.cluster_by {|x| x[0]}
111
+ # def cascade(*methods)
112
+ # methods.inject(self){ |ary, method| ary.map{ |x| x.send(method)}}
113
+ # end
114
+
115
+ # Say you want to count letters--
151
116
  #
152
- # _produces_
117
+ # some_text.inject!(Hash.new(0)) {|h,l| h[l] += 1}
153
118
  #
154
- # [ ['a'], ['is'], ['this', 'test'] ]
119
+ # vs
155
120
  #
156
- # CREDIT Erik Veenstra
157
-
158
- def cluster_by(&b)
159
- group_by(&b).sort.transpose.pop || [] # group_by(&b).values ?
160
- end
161
-
162
- # Split on matching pattern.
121
+ # some_text.inject(Hash.new(0)) {|h,l| h[l] +=1; h}
163
122
  #
164
- # ['a1','b1','a2','b2'].divide(/^a/)
165
- # => [['a1,'b1'],['a2','b2']]
123
+ # CREDIT: David Black
166
124
 
167
- def divide(pattern)
168
- inject([]) do |memo,obj|
169
- memo.push [] if pattern === obj
170
- memo.last << obj
171
- memo
172
- end
125
+ def inject!(s)
126
+ k = s
127
+ each { |i| yield(k, i) }
128
+ k
173
129
  end
174
130
 
175
- # Iterate through slices. If slicing +step+ is not
176
- # given, the the arity if the block is used.
131
+ # Say you want to count letters--
177
132
  #
178
- # x = []
179
- # [1,2,3,4].each_by{ |a,b| x << [a,b] }
180
- # x #=> [ [1,2], [3,4] ]
133
+ # some_text.injecting(Hash.new(0)) {|h,l| h[l] += 1}
181
134
  #
182
- # x = []
183
- # [1,2,3,4,5,6].each_by(3){ |a| x << a }
184
- # x #=> [ [1,2,3], [4,5,6] ]
185
-
186
- def each_by(step=nil, &yld)
187
- if step
188
- each_slice(step,&yld)
189
- else
190
- step = yld.arity.abs
191
- each_slice(step,&yld)
192
- end
193
- end
194
-
195
- # Iterators over each element pairing.
135
+ # vs
196
136
  #
197
- # [:a,:b,:c,:d].each_pair { |a,b| puts "#{a} -> #{b}" }
137
+ # some_text.inject(Hash.new(0)) {|h,l| h[l] +=1; h}
198
138
  #
199
- # _produces_
139
+ # This may be deprecated in favor of inject!. We make both
140
+ # available for now to make sure (via the test of time) that
141
+ # they are 100% equivalent.
200
142
  #
201
- # a -> b
202
- # c -> d
143
+ # CREDIT: Louis J Scoras
203
144
 
204
- def each_pair #:yield:
205
- e1 = nil
206
- each_with_index do |e,i|
207
- if i % 2 == 0
208
- e1 = e
209
- next
210
- else
211
- yield(e1,e)
212
- end
145
+ def injecting(s)
146
+ inject(s) do |k, i|
147
+ yield(k, i); k
213
148
  end
214
149
  end
215
150
 
216
- # Collect each n items.
217
- #
218
- # CREDIT Martin DeMello
219
-
220
- def eachn(&block)
221
- n = block.arity.abs
222
- each_slice(n) {|i| block.call(*i)}
223
- end
224
-
225
- # Conditional collect.
226
-
227
- def collect_if(&b)
228
- a = map(&b)
229
- # to get the same semantics as select{|e| e}
230
- a.delete(false)
231
- a.compact!
232
- a
233
- end
234
-
235
- alias_method :map_if, :collect_if
236
151
 
237
- # DEPRECATED
152
+ # DEPRECATED:
238
153
  #
239
154
  # # Why the term counter? There may be a change in Ruby 2.0
240
155
  # # to use this word instead of index. Index will
@@ -244,9 +159,6 @@ module Enumerable
244
159
  # alias_method( :collect_with_counter, :collect_with_index )
245
160
  # alias_method( :map_with_counter, :collect_with_index )
246
161
  #
247
- # # More appropriate naming since an enumerable is not
248
- # # neccesarily "indexed", as is an Array or Hash.
249
- # alias_method :each_with_counter, :each_with_index
162
+ # #instance_map and #instance_select --too invasive for convenience.
250
163
 
251
164
  end
252
-