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.
- data/AUTHORS +14 -12
- data/CHANGES +45 -2
- data/NOTES +9 -7
- data/lib/core/facets/1stclassmethod.rb +15 -11
- data/lib/core/facets/array.rb +0 -1
- data/lib/core/facets/array/conjoin.rb +40 -8
- data/lib/core/facets/array/delete.rb +8 -2
- data/lib/core/facets/array/indexable.rb +30 -3
- data/lib/core/facets/array/merge.rb +11 -0
- data/lib/core/facets/array/only.rb +3 -3
- data/lib/core/facets/array/pad.rb +4 -46
- data/lib/core/facets/array/rotate.rb +4 -4
- data/lib/core/facets/array/select.rb +2 -0
- data/lib/core/facets/array/splice.rb +16 -2
- data/lib/core/facets/array/stackable.rb +6 -40
- data/lib/core/facets/binding.rb +3 -0
- data/lib/core/facets/binding/cflow.rb +10 -64
- data/lib/core/facets/binding/defined.rb +10 -0
- data/lib/core/facets/binding/eval.rb +10 -76
- data/lib/core/facets/binding/here.rb +9 -0
- data/lib/core/facets/binding/self.rb +10 -0
- data/lib/core/facets/binding/vars.rb +0 -45
- data/lib/core/facets/boolean.rb +31 -103
- data/lib/core/facets/class/descendents.rb +17 -44
- data/lib/core/facets/comparable/bound.rb +8 -70
- data/lib/core/facets/comparable/cmp.rb +12 -92
- data/lib/core/facets/conversion.rb +122 -321
- data/lib/core/facets/dir/multiglob.rb +0 -13
- data/lib/core/facets/dir/traverse.rb +61 -111
- data/lib/core/facets/enumerable.rb +4 -2
- data/lib/core/facets/enumerable/cartesian.rb +36 -85
- data/lib/core/facets/enumerable/collect.rb +64 -152
- data/lib/core/facets/enumerable/combination.rb +40 -42
- data/lib/core/facets/enumerable/count.rb +99 -174
- data/lib/core/facets/enumerable/each.rb +86 -0
- data/lib/core/facets/enumerable/mash.rb +58 -0
- data/lib/core/facets/enumerable/permutation.rb +39 -44
- data/lib/core/facets/enumerable/probability.rb +16 -90
- data/lib/core/facets/enumerable/split.rb +113 -0
- data/lib/core/facets/exception/detail.rb +1 -2
- data/lib/core/facets/facets.rb +3 -2
- data/lib/core/facets/file/read.rb +4 -59
- data/lib/core/facets/file/topath.rb +8 -96
- data/lib/core/facets/file/write.rb +21 -49
- data/lib/core/facets/filetest/root.rb +4 -3
- data/lib/core/facets/functor.rb +5 -43
- data/lib/core/facets/hash/at.rb +7 -37
- data/lib/core/facets/hash/delete.rb +9 -58
- data/lib/core/facets/hash/has_keys.rb +4 -43
- data/lib/core/facets/hash/insert.rb +5 -38
- data/lib/core/facets/hash/inverse.rb +2 -41
- data/lib/core/facets/hash/iterate.rb +4 -45
- data/lib/core/facets/hash/keyize.rb +24 -92
- data/lib/core/facets/hash/merge.rb +4 -38
- data/lib/core/facets/hash/new.rb +5 -38
- data/lib/core/facets/hash/op.rb +20 -66
- data/lib/core/facets/hash/rekey.rb +9 -87
- data/lib/core/facets/hash/select.rb +1 -1
- data/lib/core/facets/hash/slice.rb +42 -0
- data/lib/core/facets/hash/traverse.rb +6 -46
- data/lib/core/facets/hash/update.rb +27 -67
- data/lib/core/facets/hash/weave.rb +22 -42
- data/lib/core/facets/indexable.rb +42 -14
- data/lib/core/facets/integer/bitmask.rb +69 -106
- data/lib/core/facets/integer/factorial.rb +1 -44
- data/lib/core/facets/integer/multiples.rb +27 -22
- data/lib/core/facets/integer/of.rb +1 -33
- data/lib/core/facets/kernel.rb +4 -2
- data/lib/core/facets/kernel/ask.rb +15 -3
- data/lib/core/facets/kernel/callstack.rb +38 -69
- data/lib/core/facets/kernel/constant.rb +2 -38
- data/lib/core/facets/kernel/deepcopy.rb +3 -55
- data/lib/core/facets/kernel/dir.rb +2 -0
- data/lib/core/facets/kernel/ergo.rb +2 -2
- data/lib/core/facets/kernel/instance.rb +51 -120
- data/lib/core/facets/kernel/metaid.rb +35 -73
- data/lib/core/facets/kernel/object.rb +14 -39
- data/lib/core/facets/kernel/op_esc.rb +24 -2
- data/lib/core/facets/kernel/populate.rb +6 -69
- data/lib/core/facets/kernel/report.rb +28 -33
- data/lib/core/facets/kernel/require.rb +7 -21
- data/lib/core/facets/kernel/respond.rb +11 -1
- data/lib/core/facets/kernel/returning.rb +50 -0
- data/lib/core/facets/kernel/silence.rb +12 -24
- data/lib/core/facets/kernel/super.rb +12 -76
- data/lib/core/facets/kernel/tap.rb +25 -107
- data/lib/core/facets/kernel/val.rb +7 -46
- data/lib/core/facets/kernel/withattr.rb +6 -64
- data/lib/core/facets/matchdata/matchset.rb +8 -50
- data/lib/core/facets/module.rb +3 -1
- data/lib/core/facets/module/abstract.rb +9 -47
- data/lib/core/facets/module/alias.rb +11 -68
- data/lib/core/facets/module/attr.rb +36 -15
- data/lib/core/facets/module/cattr.rb +8 -76
- data/lib/core/facets/module/clone.rb +15 -66
- data/lib/core/facets/module/include.rb +54 -114
- data/lib/core/facets/module/methods.rb +15 -13
- data/lib/core/facets/module/modify.rb +20 -206
- data/lib/core/facets/module/name.rb +19 -83
- data/lib/core/facets/module/require.rb +48 -53
- data/lib/core/facets/module/traits.rb +74 -33
- data/lib/core/facets/nilclass/status.rb +25 -2
- data/lib/core/facets/numeric/round.rb +24 -89
- data/lib/core/facets/proc/bind.rb +16 -59
- data/lib/core/facets/proc/compose.rb +6 -40
- data/lib/core/facets/proc/fn.rb +2 -0
- data/lib/core/facets/range/combine.rb +15 -51
- data/lib/core/facets/range/overlap.rb +8 -64
- data/lib/core/facets/regexp/arity.rb +6 -41
- data/lib/core/facets/stackable.rb +43 -4
- data/lib/core/facets/string.rb +2 -0
- data/lib/core/facets/string/align.rb +45 -55
- data/lib/core/facets/string/blank.rb +2 -46
- data/lib/core/facets/string/bracket.rb +14 -87
- data/lib/core/facets/string/case.rb +45 -32
- data/lib/core/facets/string/crypt.rb +3 -40
- data/lib/core/facets/string/filter.rb +7 -49
- data/lib/core/facets/string/format.rb +24 -126
- data/lib/core/facets/string/indexable.rb +50 -133
- data/lib/core/facets/string/interpolate.rb +24 -59
- data/lib/core/facets/string/natcmp.rb +5 -39
- data/lib/core/facets/string/nchar.rb +37 -45
- data/lib/core/facets/string/op.rb +13 -0
- data/lib/core/facets/string/partitions.rb +38 -99
- data/lib/core/facets/string/range.rb +8 -49
- data/lib/core/facets/string/regesc.rb +9 -42
- data/lib/core/facets/string/scan.rb +6 -52
- data/lib/core/facets/string/splice.rb +8 -13
- data/lib/core/facets/string/tabs.rb +16 -153
- data/lib/core/facets/symbol.rb +3 -1
- data/lib/core/facets/symbol/chomp.rb +11 -29
- data/lib/core/facets/symbol/generate.rb +4 -43
- data/lib/core/facets/symbol/not.rb +13 -25
- data/lib/core/facets/symbol/shadow.rb +2 -40
- data/lib/core/facets/symbol/succ.rb +14 -13
- data/lib/core/facets/symbol/to_proc.rb +33 -28
- data/lib/core/facets/time.rb +1 -0
- data/lib/core/facets/time/change.rb +5 -38
- data/lib/core/facets/time/elapse.rb +2 -41
- data/lib/core/facets/time/stamp.rb +47 -0
- data/lib/core/facets/unboundmethod.rb +3 -0
- data/lib/core/facets/unboundmethod/arguments.rb +27 -4
- data/lib/core/facets/unboundmethod/name.rb +21 -7
- data/lib/methods/facets/enumerable/cluster_by.rb +1 -1
- data/lib/methods/facets/enumerable/collate.rb +1 -0
- data/lib/methods/facets/enumerable/divide.rb +1 -1
- data/lib/methods/facets/enumerable/each_by.rb +1 -1
- data/lib/methods/facets/enumerable/each_pair.rb +1 -1
- data/lib/methods/facets/enumerable/eachn.rb +1 -1
- data/lib/methods/facets/enumerable/graph.rb +1 -1
- data/lib/methods/facets/enumerable/group_by.rb +1 -1
- data/lib/methods/facets/enumerable/inject.rb +1 -0
- data/lib/methods/facets/enumerable/map_send.rb +1 -0
- data/lib/methods/facets/enumerable/modulate.rb +1 -0
- data/lib/methods/facets/enumerable/partition_by.rb +1 -1
- data/lib/methods/facets/hash/collate.rb +1 -1
- data/lib/methods/facets/hash/except.rb +1 -0
- data/lib/methods/facets/hash/graph.rb +1 -1
- data/lib/methods/facets/hash/mash.rb +1 -0
- data/lib/methods/facets/kernel/Bit.rb +1 -0
- data/lib/methods/facets/kernel/complete.rb +1 -1
- data/lib/methods/facets/kernel/here.rb +1 -1
- data/lib/methods/facets/kernel/non_nil.rb +1 -0
- data/lib/methods/facets/kernel/respond_with_value.rb +1 -0
- data/lib/methods/facets/kernel/with.rb +1 -1
- data/lib/methods/facets/module/class_def.rb +1 -0
- data/lib/methods/facets/string/camelcase.rb +1 -0
- data/lib/methods/facets/string/op_minus.rb +1 -0
- data/lib/methods/facets/string/snakecase.rb +1 -0
- data/lib/more/facets/attributes.rb +5 -5
- data/lib/more/facets/basicobject.rb +0 -62
- data/lib/{core/facets/continuation/create.rb → more/facets/continuation.rb} +4 -21
- data/lib/more/facets/duration.rb +534 -0
- data/lib/more/facets/lazy.rb +3 -3
- data/lib/more/facets/namespace.rb +23 -71
- data/lib/more/facets/rbsystem.rb +42 -8
- data/lib/more/facets/stylize.rb +6 -3
- data/lib/more/facets/thread.rb +55 -0
- data/meta/MANIFEST +49 -18
- data/meta/ROLLRC +1 -1
- data/meta/project.yaml +2 -2
- data/task/install +1 -1
- data/task/test/general +8 -2
- data/test/unit/array/test_pad.rb +30 -45
- data/test/unit/array/test_stackable.rb +14 -28
- data/test/unit/binding/test_cflow.rb +34 -49
- data/test/unit/binding/test_defined.rb +17 -0
- data/test/unit/binding/test_eval.rb +11 -39
- data/test/unit/binding/test_here.rb +17 -0
- data/test/unit/binding/test_self.rb +17 -0
- data/test/unit/binding/test_vars.rb +22 -37
- data/test/unit/class/test_descendents.rb +15 -30
- data/test/unit/class/test_initializer.rb +1 -8
- data/test/unit/comparable/test_bound.rb +38 -53
- data/test/unit/comparable/test_cmp.rb +45 -60
- data/test/unit/dir/test_traverse.rb +56 -0
- data/test/unit/enumerable/test_cartesian.rb +34 -47
- data/test/unit/enumerable/test_collect.rb +16 -125
- data/test/unit/enumerable/test_combination.rb +1 -8
- data/test/unit/enumerable/test_count.rb +51 -66
- data/test/unit/enumerable/test_each.rb +77 -0
- data/test/unit/enumerable/test_mash.rb +51 -0
- data/test/unit/enumerable/test_permutation.rb +1 -7
- data/test/unit/enumerable/test_probability.rb +42 -55
- data/test/unit/enumerable/test_split.rb +52 -0
- data/test/unit/exception/test_detail.rb +19 -0
- data/test/unit/file/test_read.rb +34 -0
- data/test/unit/file/test_topath.rb +17 -25
- data/test/unit/file/test_write.rb +6 -12
- data/test/unit/filetest/test_root.rb +14 -0
- data/test/unit/hash/test_at.rb +9 -21
- data/test/unit/hash/test_delete.rb +22 -37
- data/test/unit/hash/test_has_keys.rb +13 -28
- data/test/unit/hash/test_insert.rb +9 -23
- data/test/unit/hash/test_inverse.rb +11 -26
- data/test/unit/hash/test_iterate.rb +16 -31
- data/test/unit/hash/test_keyize.rb +40 -55
- data/test/unit/hash/test_merge.rb +10 -25
- data/test/unit/hash/test_new.rb +9 -24
- data/test/unit/hash/test_op.rb +1 -7
- data/test/unit/hash/test_rekey.rb +47 -62
- data/test/unit/hash/test_traverse.rb +17 -32
- data/test/unit/hash/test_update.rb +30 -45
- data/test/unit/hash/test_weave.rb +10 -23
- data/test/unit/integer/test_bitmask.rb +48 -44
- data/test/unit/integer/test_factorial.rb +11 -26
- data/test/unit/integer/test_multiples.rb +1 -5
- data/test/unit/integer/test_of.rb +14 -29
- data/test/unit/kernel/test_callstack.rb +13 -28
- data/test/unit/kernel/test_constant.rb +14 -28
- data/test/unit/kernel/test_deepcopy.rb +20 -35
- data/test/unit/kernel/test_instance.rb +46 -61
- data/test/unit/kernel/test_metaid.rb +42 -57
- data/test/unit/kernel/test_object.rb +14 -29
- data/test/unit/kernel/test_populate.rb +38 -53
- data/test/unit/kernel/test_report.rb +1 -7
- data/test/unit/kernel/test_returning.rb +16 -0
- data/test/unit/kernel/test_silence.rb +8 -23
- data/test/unit/kernel/test_super.rb +41 -56
- data/test/unit/kernel/test_tap.rb +15 -39
- data/test/unit/kernel/test_val.rb +7 -20
- data/test/unit/kernel/test_withattr.rb +29 -44
- data/test/unit/matchdata/test_matchset.rb +20 -35
- data/test/unit/module/test_abstract.rb +15 -30
- data/test/unit/module/test_alias.rb +32 -45
- data/test/unit/module/test_cattr.rb +39 -54
- data/test/unit/module/test_clone.rb +31 -43
- data/test/unit/module/test_include.rb +1 -35
- data/test/unit/module/test_modify.rb +102 -114
- data/test/unit/module/test_name.rb +1 -7
- data/test/unit/numeric/test_round.rb +46 -61
- data/test/unit/proc/test_bind.rb +29 -44
- data/test/unit/proc/test_compose.rb +20 -35
- data/test/unit/range/test_combine.rb +14 -29
- data/test/unit/range/test_overlap.rb +34 -51
- data/test/unit/regexp/test_arity.rb +14 -29
- data/test/unit/string/test_align.rb +13 -27
- data/test/unit/string/test_blank.rb +12 -27
- data/test/unit/string/test_bracket.rb +52 -67
- data/test/unit/string/test_case.rb +19 -38
- data/test/unit/string/test_crypt.rb +10 -25
- data/test/unit/string/test_filter.rb +1 -7
- data/test/unit/string/test_format.rb +2 -7
- data/test/unit/string/test_indexable.rb +54 -69
- data/test/unit/string/test_interpolate.rb +8 -21
- data/test/unit/string/test_natcmp.rb +11 -26
- data/test/unit/string/test_nchar.rb +1 -14
- data/test/unit/string/test_op.rb +14 -0
- data/test/unit/string/test_partitions.rb +39 -54
- data/test/unit/string/test_range.rb +17 -32
- data/test/unit/string/test_regesc.rb +1 -7
- data/test/unit/string/test_scan.rb +23 -38
- data/test/unit/string/test_stackable.rb +79 -98
- data/test/unit/string/test_tabs.rb +1 -7
- data/test/unit/symbol/test_chomp.rb +10 -21
- data/test/unit/symbol/test_generate.rb +7 -22
- data/test/unit/symbol/test_not.rb +10 -25
- data/test/unit/symbol/test_shadow.rb +8 -23
- data/test/unit/symbol/test_succ.rb +1 -7
- data/test/unit/symbol/test_to_proc.rb +1 -7
- data/test/unit/test_attributes.rb +1 -1
- data/test/unit/test_continuation.rb +13 -0
- data/test/unit/test_conversion.rb +1 -14
- data/test/unit/test_namespace.rb +30 -3
- data/test/unit/test_thread.rb +23 -0
- data/test/unit/time/test_change.rb +11 -26
- data/test/unit/time/test_elapse.rb +10 -25
- data/test/unit/time/test_stamp.rb +28 -0
- metadata +65 -25
- data/lib/core/facets/array/unzip.rb +0 -14
- data/lib/core/facets/continuation.rb +0 -1
- data/lib/core/facets/enumerable/collate.rb +0 -104
- data/lib/core/facets/kernel/require_esc.rb +0 -44
- data/lib/more/facets/mapsend.rb +0 -98
- data/lib/more/facets/pp_s.rb +0 -30
- data/log/history.rd +0 -38
- data/log/todo.rd +0 -4
- data/task/special/quickopts +0 -15
- data/test/unit/continuation/test_create.rb +0 -28
- data/test/unit/enumerable/test_collate.rb +0 -51
- data/test/unit/kernel/test_require_esc.rb +0 -29
- data/test/unit/test_mapsend.rb +0 -18
- 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
|
data/lib/core/facets/hash/new.rb
CHANGED
@@ -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
|
data/lib/core/facets/hash/op.rb
CHANGED
@@ -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
|
@@ -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
|
+
|