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,17 +1,3 @@
1
- # TITLE:
2
- #
3
- # Reverse Merge
4
- #
5
- # SUMMARY:
6
- #
7
- # Like merge, but give the parameter priority over the
8
- # reciever.
9
- #
10
- # CREDITS:
11
- #
12
- # - Gavin Sinclair
13
- # - Thomas Sawyer
14
-
15
1
  class Hash
16
2
 
17
3
  # Allows for reverse merging where its the keys in the
@@ -30,34 +16,14 @@ class Hash
30
16
  other.merge(self)
31
17
  end
32
18
 
19
+ # Inplace form of #reverse_merge.
20
+
33
21
  def reverse_merge!(other)
34
22
  replace(reverse_merge(other))
35
23
  end
36
24
 
25
+ # Obvious alias for reverse_merge!
26
+
37
27
  alias_method :reverse_update, :reverse_merge!
38
28
 
39
29
  end
40
-
41
-
42
- # _____ _
43
- # |_ _|__ ___| |_
44
- # | |/ _ \/ __| __|
45
- # | | __/\__ \ |_
46
- # |_|\___||___/\__|
47
- #
48
- =begin test
49
-
50
- require 'test/unit'
51
-
52
- class TestHashReverseMerge < Test::Unit::TestCase
53
-
54
- def test_reverse_merge
55
- h1 = { :a=>1, :b=>2, :c=>2 }
56
- h2 = { :c=>3 }
57
- h3 = h1.reverse_merge(h2) )
58
- assert_equal( 2, h3[:c] )
59
- end
60
-
61
- end
62
-
63
- =end
@@ -1,17 +1,3 @@
1
- # TITLE:
2
- #
3
- # Hash Constructor Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # Alternate constructors for Hash.
8
- #
9
- # CREDIT:
10
- #
11
- # - Jan Molic
12
- # - Ara.T.Howard
13
-
14
- #
15
1
  class Hash
16
2
 
17
3
  # Hash which auto initializes it's children.
@@ -28,6 +14,8 @@ class Hash
28
14
  # p ah['section one'].keys
29
15
  # # ["param one", "param four", "param three", "param two"]
30
16
  #
17
+ # CREDIT: Trans
18
+ # CREDIT: Jan Molic
31
19
 
32
20
  def self.autonew(*args)
33
21
  #new(*args){|a,k| a[k] = self.class::new(*args)}
@@ -41,6 +29,9 @@ class Hash
41
29
  # Hash.zipnew(["a","b","c"], [1,2,3])
42
30
  # #=> { "a"=>1, "b"=>2, "c"=>3 }
43
31
  #
32
+ # CREDIT: Trans
33
+ # CREDIT: Ara.T.Howard
34
+
44
35
  def self.zipnew(keys,values) # or some better name
45
36
  h = {}
46
37
  keys.size.times{ |i| h[ keys[i] ] = values[i] }
@@ -48,27 +39,3 @@ class Hash
48
39
  end
49
40
 
50
41
  end
51
-
52
-
53
-
54
- # _____ _
55
- # |_ _|__ ___| |_
56
- # | |/ _ \/ __| __|
57
- # | | __/\__ \ |_
58
- # |_|\___||___/\__|
59
- #
60
- =begin test
61
-
62
- require 'test/unit'
63
-
64
- class TestHashNew < Test::Unit::TestCase
65
-
66
- def test_zipnew
67
- a = [1,2,3]
68
- b = [4,5,6]
69
- assert_equal( {1=>4,2=>5,3=>6}, Hash.zipnew(a,b) )
70
- end
71
-
72
- end
73
-
74
- =end
@@ -1,26 +1,9 @@
1
- # TITLE:
2
- #
3
- # Hash Operators
4
- #
5
- # SUMMARY:
6
- #
7
- # Operators for common methods, such as merge and update,
8
- # plus some usefule variaions like reverse_merge.
9
- #
10
- # CREDITS:
11
- #
12
- # - Thomas Sawyer
13
- #
14
- # TODO:
15
- #
16
- # - Rewrite #diff to be more readable.
17
- # - Rename #diff to #difference or something else?
18
-
19
- #
20
1
  class Hash
21
2
 
22
3
  # Can be used like update, or passed
23
4
  # as two-element [key,value] array.
5
+ #
6
+ # CREDIT: Trans
24
7
 
25
8
  def <<(other)
26
9
  if other.respond_to?(:to_ary)
@@ -43,6 +26,8 @@ class Hash
43
26
  # The later form is similar to #pairs_at. The differ only
44
27
  # in that #pairs_at will return a nil value for a key
45
28
  # not in the hash, but #& will not.
29
+ #
30
+ # CREDIT: Trans
46
31
 
47
32
  def &(other)
48
33
  case other
@@ -57,13 +42,17 @@ class Hash
57
42
  end
58
43
  end
59
44
 
60
- # Operator for reverse_merge.
45
+ # Operator for #reverse_merge.
46
+ #
47
+ # CREDIT: Trans
61
48
 
62
49
  def |(other)
63
50
  other.merge(self)
64
51
  end
65
52
 
66
- # Operator for merge.
53
+ # Operator for #merge.
54
+ #
55
+ # CREDIT: Trans
67
56
 
68
57
  def +(other)
69
58
  merge(other)
@@ -72,6 +61,8 @@ class Hash
72
61
  # Operator for remove hash paris. If another hash is given
73
62
  # the pairs are only removed if both key and value are equal.
74
63
  # If an array is given then mathcing keys are removed.
64
+ #
65
+ # CREDIT: Trans
75
66
 
76
67
  def -(other)
77
68
  h = self.dup
@@ -96,60 +87,23 @@ class Hash
96
87
  #
97
88
  # h1 + h2 #=> { :a=>2, :b=>3 }
98
89
  # h1 * h2 #=> { :a=>1, :b=>3 }
90
+ #
91
+ # CREDIT: Trans
99
92
 
100
93
  def *(other)
101
94
  other.merge(self)
102
95
  end
103
96
 
104
97
  # Difference comparison of two hashes.
98
+ #
99
+ # CREDIT: ?
100
+ #
101
+ # TODO:
102
+ # - Rewrite #diff to be more readable.
103
+ # - Rename #diff to #difference or something else?
105
104
 
106
105
  def diff(h2)
107
106
  dup.send(:delete_if){|k,v| h2[k] == v}.send(:merge,h2.dup.send(:delete_if){ |k,v| has_key?(k) })
108
107
  end
109
108
 
110
109
  end
111
-
112
-
113
- # _____ _
114
- # |_ _|__ ___| |_
115
- # | |/ _ \/ __| __|
116
- # | | __/\__ \ |_
117
- # |_|\___||___/\__|
118
- #
119
- =begin test
120
-
121
- require 'test/unit'
122
-
123
- class TestHashOperate < Test::Unit::TestCase
124
-
125
- def test_op_and_hash
126
- a = { :a => 1, :b => 2 }
127
- b = { :a => 1 }
128
- r = { :a => 1 }
129
- assert_equal( r, a & b )
130
- end
131
-
132
- def test_op_and_hash_subarray
133
- a = { :a => [1], :b => [2] }
134
- b = { :a => [1] }
135
- r = { :a => [1] }
136
- assert_equal( r, a & b )
137
- end
138
-
139
- def test_op_and_array
140
- a = { :a => 1, :b => 2 }
141
- b = [ :a ]
142
- r = { :a => 1 }
143
- assert_equal( r, a & b )
144
- end
145
-
146
- def test_shift_update
147
- a = { :a => 1, :b => 2, :c => 3 }
148
- b = { :a => 0, :d => 4 }
149
- e = { :a => 0, :b => 2, :c => 3, :d => 4 }
150
- assert_equal( e, a << b )
151
- end
152
-
153
- end
154
-
155
- =end
@@ -1,19 +1,5 @@
1
- # TITLE:
2
- #
3
- # Hash Rekeying Extensions
4
- #
5
- # SUMMARY:
6
- #
7
- # Extensions for rekeying a Hash (exluding #update_keys).
8
- #
9
- # CREDITS:
10
- #
11
- # - Gavin Sinclair
12
- # - Thomas Sawyer
13
-
14
1
  require 'facets/conversion'
15
2
 
16
- #
17
3
  class Hash
18
4
 
19
5
  # Converts all keys in the Hash accroding to the given block.
@@ -24,6 +10,7 @@ class Hash
24
10
  # foo.rekey{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa }
25
11
  # foo.inspect #=> { :name =>"Gavin", :wife=>:Lisa }
26
12
  #
13
+ # CREDIT: Trans
27
14
 
28
15
  def rekey( meth=nil, &block )
29
16
  raise ArgumentError, "2 for 1" if meth and block
@@ -36,6 +23,7 @@ class Hash
36
23
  # foo.rekey!{ |k| k.to_s } #=> { "name"=>"Gavin", "wife"=>:Lisa }
37
24
  # foo.inspect #=> { "name"=>"Gavin", "wife"=>:Lisa }
38
25
  #
26
+ # CREDIT: Trans
39
27
 
40
28
  def rekey!( meth=nil, &block )
41
29
  meth = :to_sym unless meth or block
@@ -48,8 +36,6 @@ class Hash
48
36
  self
49
37
  end
50
38
 
51
- # CREDIT Gavin Sinclair
52
-
53
39
  # Modifies the receiving Hash so that the value previously referred to by
54
40
  # _oldkey_ is also referenced by _newkey_; _oldkey_ is retained in the Hash.
55
41
  # If _oldkey_ does not exist as a key in the Hash, no change is effected.
@@ -67,6 +53,9 @@ class Hash
67
53
  #
68
54
  # Note that if the _oldkey_ is reassigned, the reference will no longer exist,
69
55
  # and the _newkey_ will remain as it was.
56
+ #
57
+ # CREDIT: Gavin Sinclair
58
+
70
59
  def alias!( newkey, oldkey )
71
60
  self[newkey] = self[oldkey] if self.has_key?(oldkey)
72
61
  self
@@ -76,6 +65,8 @@ class Hash
76
65
  #
77
66
  # {:a=>1,:b=>2}.swap!(:a,:b) #=> {:a=>2,:b=>1}
78
67
  #
68
+ # CREDIT: Gavin Sinclair
69
+
79
70
  def swap!( key1, key2 )
80
71
  tmp = self[key1]
81
72
  self[key1] = self[key2]
@@ -83,8 +74,6 @@ class Hash
83
74
  self
84
75
  end
85
76
 
86
- # CREDIT Gavin Sinclair
87
-
88
77
  # Modifies the receiving Hash so that the value previously referred to by
89
78
  # _oldkey_ is referenced by _newkey_; _oldkey_ is removed from the Hash.
90
79
  # If _oldkey_ does not exist as a key in the Hash, no change is effected.
@@ -95,6 +84,8 @@ class Hash
95
84
  # foo.swapkey!('a',:a) #=> { 'a'=>1, :b=>2 }
96
85
  # foo.swapkey!('b',:b) #=> { 'a'=>1, 'b'=>2 }
97
86
  # foo.swapkey!('foo','bar') #=> { 'a'=>1, 'b'=>2 }
87
+ #
88
+ # CREDIT: Gavin Sinclair
98
89
 
99
90
  def swapkey!( newkey, oldkey )
100
91
  self[newkey] = self.delete(oldkey) if self.has_key?(oldkey)
@@ -102,72 +93,3 @@ class Hash
102
93
  end
103
94
 
104
95
  end
105
-
106
-
107
-
108
- # _____ _
109
- # |_ _|__ ___| |_
110
- # | |/ _ \/ __| __|
111
- # | | __/\__ \ |_
112
- # |_|\___||___/\__|
113
- #
114
- =begin test
115
-
116
- require 'test/unit'
117
-
118
- class TestHashRekey < Test::Unit::TestCase
119
-
120
- def test_alias!
121
- foo = { 'a'=>1, 'b'=>2 }
122
- assert_equal( { 'a'=>1, 'b'=>2, 'c'=>2 }, foo.alias!('c','b') )
123
- foo = { 'a'=>1, 'b'=>2 }
124
- assert_equal( { :a=>1, 'a'=>1, 'b'=>2 }, foo.alias!(:a,'a') )
125
- foo = { :a=>1, :b=>2 }
126
- assert_equal( { :a=>1, :b=>2 }, foo.alias!('bar','foo') )
127
- end
128
-
129
- def test_rekey_01
130
- foo = { :a=>1, :b=>2 }
131
- assert_equal( { "a"=>1, "b"=>2 }, foo.rekey{|k|k.to_s} )
132
- assert_equal( { :a =>1, :b=>2 }, foo )
133
- end
134
-
135
- def test_rekey_02
136
- foo = { :a=>1, :b=>2 }
137
- assert_equal( { "a"=>1, "b"=>2 }, foo.rekey!{|k|k.to_s} )
138
- assert_equal( { "a"=>1, "b"=>2 }, foo )
139
- end
140
-
141
- def test_rekey_03
142
- foo = { :a=>1, :b=>2 }
143
- assert_equal( { "a"=>1, "b"=>2 }, foo.rekey(:to_s) )
144
- assert_equal( { :a =>1, :b=>2 }, foo )
145
- end
146
-
147
- def test_rekey_04
148
- foo = { :a=>1, :b=>2 }
149
- assert_equal( { "a"=>1, "b"=>2 }, foo.rekey!(:to_s) )
150
- assert_equal( { "a"=>1, "b"=>2 }, foo )
151
- end
152
-
153
- def test_rekey_05
154
- foo = { "a"=>1, "b"=>2 }
155
- assert_equal( { :a=>1, :b=>2 }, foo.rekey! )
156
- assert_equal( { :a=>1, :b=>2 }, foo )
157
- end
158
-
159
- def test_swap!
160
- h = { :a=>1, :b=>2 }
161
- assert_equal( { :a=>2, :b=>1 }, h.swap!(:a, :b) )
162
- end
163
-
164
- def test_swapkeys!
165
- foo = { :a=>1, :b=>2 }
166
- assert_equal( { 'a'=>1, :b=>2 }, foo.swapkey!('a', :a) )
167
- assert_equal( { 'a'=>1, 'b'=>2 }, foo.swapkey!('b', :b) )
168
- assert_equal( { 'a'=>1, 'b'=>2 }, foo.swapkey!('foo','bar') )
169
- end
170
-
171
- end
172
-
173
- =end
@@ -3,8 +3,8 @@ class Hash
3
3
  # In-place version of Hash#select. The opposite of the built-in
4
4
  # Hash#reject!.
5
5
  #
6
- # CREDIT Noah Gibbs
7
6
  # CREDIT Gavin Sinclair
7
+ # CREDIT Noah Gibbs
8
8
 
9
9
  def select!
10
10
  reject! { |k,v| not yield(k,v) }
@@ -0,0 +1,42 @@
1
+ class Hash
2
+
3
+ # Returns a new hash with only the given keys.
4
+
5
+ def slice(*keep_keys)
6
+ h = {}
7
+ keep_keys.each do |key|
8
+ h[key] = fetch(key)
9
+ end
10
+ h
11
+ end
12
+
13
+ # Replaces hash with a new hash having only the given keys.
14
+ # This return the hash of keys removed.
15
+
16
+ def slice!(*keep_keys)
17
+ removed = except(*keep_keys)
18
+ replace(slice(*keep_keys))
19
+ removed
20
+ end
21
+
22
+ # Returns a new hash less the given keys.
23
+
24
+ def except(*less_keys)
25
+ slice(*keys - less_keys)
26
+ end
27
+
28
+ # Replaces hash with new hash less the given keys.
29
+ # This returns the hash of keys removed.
30
+ #
31
+ # h = {:a=>1, :b=>2, :c=>3}
32
+ # h.except!(:a) #=> {:a=>1}
33
+ # h #=> {:b=>2,:c=>3}
34
+ #
35
+ def except!(*less_keys)
36
+ removed = slice(*less_keys)
37
+ replace(except(*less_keys))
38
+ removed
39
+ end
40
+
41
+ end
42
+