mug 0.13.0 → 0.14.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa82b3dcf328caf01f65d84a51ac4bdfdc186c91648f5b7843aa34531c4877ad
4
- data.tar.gz: a33c8edf6d0d3359c9b7ce9592bee55f2cef5b2955e74f2c71913048bbe6d61b
3
+ metadata.gz: c8175797f8f16b61b543159d47d39249fc260a6389a2d83825e5bbe3525bd33c
4
+ data.tar.gz: 3d4a5d28f5e59c652bd0267de97db75d155861e6c6467446bd453132c40be9b7
5
5
  SHA512:
6
- metadata.gz: 77ab2daffae07f208c90b692afafd8287850fc57ddeade9fb363d517ff7844a921695aee7af8522b3dc66edc09540b408e1f9c0a20d345563cf23981f6cf7806
7
- data.tar.gz: 5463372e8cb36dd4b92780354a08131b9fda6d5d34857c04dfc5e029a26b66682064b888c4b4e0b4a21b1b4ea7f1e2b7823091e80f8ec0ecba99bf1c47b7669a
6
+ metadata.gz: e0686f5a34f70143e992e2baec18eb45f53a20cba5912aa4a89d4dc95e8bb2f26c92abdde86c9ac8ea6a7f6ce817354a211dfa6083613bf88d6e3b1479d8eb8b
7
+ data.tar.gz: cb47764028f427e09864ee1d5bd1466a9e2221a07e1853b20134e1d1dbfbb01014003feabb5f641cf9aac22394b25b489838cfae832fd96c85e3c8e0b1b66171
data/lib/mug.rb CHANGED
@@ -2,7 +2,6 @@
2
2
  require_relative 'mug/affix'
3
3
  require_relative 'mug/alias'
4
4
  require_relative 'mug/and-or'
5
- require_relative 'mug/any-and-all'
6
5
  require_relative 'mug/apply'
7
6
  require_relative 'mug/array/delete_all'
8
7
  require_relative 'mug/array/extend'
@@ -12,7 +11,7 @@ require_relative 'mug/array/to_proc'
12
11
  require_relative 'mug/bool'
13
12
  require_relative 'mug/bittest'
14
13
  require_relative 'mug/clamp'
15
- require_relative 'mug/counts'
14
+ require_relative 'mug/enumerable'
16
15
  require_relative 'mug/fragile-method-chain'
17
16
  require_relative 'mug/hash/map'
18
17
  require_relative 'mug/hash/merge'
@@ -1,38 +1,3 @@
1
1
 
2
- module Enumerable
3
-
4
- #
5
- # Passes each element of the collection to the given block. The method returns `true` if the
6
- # block contains elements that never return `false` or `nil`. If the block is not given, Ruby
7
- # adds an implicit block of `{ |obj| obj }` which will cause `any_and_all?` to return `true`
8
- # when none of the collection members are `false` or `nil`.
9
- #
10
- def any_and_all? &block
11
- block ||= proc {|obj| obj }
12
-
13
- result = false
14
- each do |x|
15
- return false unless block[x]
16
- result = true
17
- end
18
- result
19
- end
20
-
21
- end
22
-
23
- =begin
24
- Copyright (c) 2016, Matthew Kerwin <matthew@kerwin.net.au>
25
-
26
- Permission to use, copy, modify, and/or distribute this software for any
27
- purpose with or without fee is hereby granted, provided that the above
28
- copyright notice and this permission notice appear in all copies.
29
-
30
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
34
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
35
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
37
- =end
2
+ require_relative 'enumerable/any-and-all'
38
3
 
@@ -1,34 +1,3 @@
1
1
 
2
- module Enumerable
3
-
4
- #
5
- # Returns a hash of item=>count showing how many
6
- # of each +item+ are in this Enumerable.
7
- #
8
- def counts &block
9
- return counts_by(&block) if block_given?
10
- hsh = Hash.new{|h,k| h[k] = 0 }
11
- each do |k|
12
- hsh[k] += 1
13
- end
14
- hsh
15
- end
16
-
17
- #
18
- # Passes each element in turn to the block, and returns a
19
- # hash of result=>count.
20
- #
21
- # If no block is given, an enumerator is returned.
22
- #
23
- def counts_by &block
24
- return enum_for(:counts_by) unless block_given?
25
- hsh = Hash.new{|h,k| h[k] = 0 }
26
- each do |j|
27
- k = yield j
28
- hsh[k] += 1
29
- end
30
- hsh
31
- end
32
-
33
- end
2
+ require_relative 'enumerable/counts'
34
3
 
@@ -0,0 +1,5 @@
1
+
2
+ require_relative 'enumerable/any-and-all'
3
+ require_relative 'enumerable/counts'
4
+ require_relative 'enumerable/hash-like'
5
+
@@ -0,0 +1,38 @@
1
+
2
+ module Enumerable
3
+
4
+ #
5
+ # Passes each element of the collection to the given block. The method returns `true` if the
6
+ # block contains elements that never return `false` or `nil`. If the block is not given, Ruby
7
+ # adds an implicit block of `{ |obj| obj }` which will cause `any_and_all?` to return `true`
8
+ # when none of the collection members are `false` or `nil`.
9
+ #
10
+ def any_and_all? &block
11
+ block ||= proc {|obj| obj }
12
+
13
+ result = false
14
+ each do |x|
15
+ return false unless block[x]
16
+ result = true
17
+ end
18
+ result
19
+ end
20
+
21
+ end
22
+
23
+ =begin
24
+ Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
25
+
26
+ Permission to use, copy, modify, and/or distribute this software for any
27
+ purpose with or without fee is hereby granted, provided that the above
28
+ copyright notice and this permission notice appear in all copies.
29
+
30
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
31
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
32
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
33
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
34
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
35
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
36
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
37
+ =end
38
+
@@ -0,0 +1,50 @@
1
+
2
+ module Enumerable
3
+
4
+ #
5
+ # Returns a hash of item=>count showing how many
6
+ # of each +item+ are in this Enumerable.
7
+ #
8
+ def counts &block
9
+ return counts_by(&block) if block_given?
10
+ hsh = Hash.new{|h,k| h[k] = 0 }
11
+ each do |k|
12
+ hsh[k] += 1
13
+ end
14
+ hsh
15
+ end
16
+
17
+ #
18
+ # Passes each element in turn to the block, and returns a
19
+ # hash of result=>count.
20
+ #
21
+ # If no block is given, an enumerator is returned.
22
+ #
23
+ def counts_by &block
24
+ return enum_for(:counts_by) unless block_given?
25
+ hsh = Hash.new{|h,k| h[k] = 0 }
26
+ each do |j|
27
+ k = yield j
28
+ hsh[k] += 1
29
+ end
30
+ hsh
31
+ end
32
+
33
+ end
34
+
35
+ =begin
36
+ Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
37
+
38
+ Permission to use, copy, modify, and/or distribute this software for any
39
+ purpose with or without fee is hereby granted, provided that the above
40
+ copyright notice and this permission notice appear in all copies.
41
+
42
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
43
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
44
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
45
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
46
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
47
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
48
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
49
+ =end
50
+
@@ -0,0 +1,244 @@
1
+
2
+ module Enumerable
3
+
4
+ ##
5
+ # Calls +block+ once for each key in the enum, passing the key-value pair as parameters.
6
+ # If no block is given, an enumerator is returned instead.
7
+ #
8
+ # @call-seq each_pair {| key, value | block } -> hsh
9
+ # @call-seq each_pair -> an_enumerator
10
+ #
11
+ def each_pair
12
+ return enum_for(:each_pair) unless block_given?
13
+ each_with_index {|e,i| yield i, e }
14
+ end
15
+
16
+ ##
17
+ # Calls +block+ once for each key in the enum, passing the key as a parameter.
18
+ # If no block is given, an enumerator is returned instead.
19
+ #
20
+ # @call-seq each_key {| key | block } -> hsh
21
+ # @call-seq each_key -> an_enumerator
22
+ #
23
+ def each_key
24
+ return enum_for(:each_key) unless block_given?
25
+
26
+ # FIXME
27
+ each_with_index {|_,i| yield i }
28
+ end
29
+
30
+ alias each_value each_entry
31
+
32
+ ##
33
+ # Returns a value from the enum for the given key. If the key can't be
34
+ # found, there are several options: With no other arguments, it will
35
+ # raise a +KeyError+ exception; if +default+ is given, then that will
36
+ # be returned; if the optional code block is specified, then that will
37
+ # be run and its result returned.
38
+ #
39
+ # @call-seq fetch(key [, default] ) -> obj
40
+ # @call-seq fetch(key) { |key| block } -> obj
41
+ #
42
+ def fetch *args
43
+ raise ArgumentError, "incorrect number of arguments (#{args.length} for 1..2)" if args.length < 1 || args.length > 2
44
+ key, default = *args
45
+
46
+ each_pair do |k,v|
47
+ return v if k == key
48
+ end
49
+ if args.length > 1
50
+ return default
51
+ elsif block_given?
52
+ yield key
53
+ else
54
+ raise KeyError, 'key not found'
55
+ end
56
+ end
57
+
58
+ ##
59
+ # Returns an array containing the values associated with the given keys
60
+ # but also raises +KeyError+ when one of keys can't be found.
61
+ # Also see +#values_at+ and +#fetch+.
62
+ #
63
+ # @call-seq fetch_values(key, ...) -> array
64
+ # @call-seq fetch_values(key, ...) { |key| block } -> array
65
+ #
66
+ def fetch_values *keys
67
+ key_map = {}
68
+ keys.each_with_index do |key, index|
69
+ key_map[key] ||= []
70
+ key_map[key] << index
71
+ end
72
+
73
+ remain = keys.length
74
+ result = [nil] * keys.length
75
+ define = [nil] * keys.length
76
+
77
+ each_pair do |k,v|
78
+ break if remain < 1
79
+
80
+ key_indices = key_map[k]
81
+ if key_indices
82
+ key_indices.each do |key_index|
83
+ result[key_index] = v
84
+ define[key_index] = true
85
+ remain -= 1
86
+ end
87
+ end
88
+ end
89
+
90
+ if remain > 0
91
+ if block_given?
92
+ define.each_with_index do |isdef, index|
93
+ next if isdef
94
+ result[index] = yield keys[index]
95
+ end
96
+ else
97
+ index = define.index nil
98
+ raise KeyError, "key not found: #{keys[index].inspect}"
99
+ end
100
+ end
101
+
102
+ result
103
+ end
104
+
105
+ alias key find_index
106
+
107
+ ##
108
+ # Returns +true+ if the given key is present in this enum.
109
+ #
110
+ # @call-seq key?(key) -> true or false
111
+ #
112
+ def key? key
113
+ each_pair.find {|k, _| key == k } && true
114
+ end
115
+ alias has_key? key?
116
+
117
+ ##
118
+ # Returns a new array populated with the keys from this enum.
119
+ #
120
+ # @call-seq keys -> array
121
+ #
122
+ def keys
123
+ each_with_index.map {|_, index| index }
124
+ end
125
+
126
+ ##
127
+ # Returns the number of key-value pairs in the hash.
128
+ #
129
+ # @call-seq length -> integer
130
+ #
131
+ def length
132
+ reduce(0) {|sum,_| sum + 1 }
133
+ end
134
+ alias size length
135
+
136
+ ##
137
+ # Returns true if the given key is present in this enum.
138
+ #
139
+ # @call-seq member?(key) -> true or false
140
+ #
141
+ def member? key
142
+ fetch(key, nil) && true
143
+ end
144
+
145
+ ##
146
+ # Returns a hash containing only the given keys and their values.
147
+ #
148
+ # @call-seq slice(*keys) -> a_hash
149
+ #
150
+ def slice *keys
151
+ missing = {}
152
+ values = fetch_values(*keys) {|key| missing[key] = nil }
153
+
154
+ result = {}
155
+ values.each_with_index do |val, i|
156
+ key = keys[i]
157
+ next if missing.key? key
158
+ next if result.key? key
159
+ result[key] = val
160
+ end
161
+ result
162
+ end
163
+
164
+ ##
165
+ # Returns a new hash with the results of running the block once for every key.
166
+ # If no block is given, an enumerator is returned instead.
167
+ #
168
+ # @call-seq transform_keys {|key| block } -> new_hash
169
+ # @call-seq transform_keys -> an_enumerator
170
+ #
171
+ def transform_keys
172
+ return enum_for(:transform_keys) unless block_given?
173
+ result = {}
174
+ each_pair do |key, value|
175
+ newkey = yield key
176
+ result[newkey] = value
177
+ end
178
+ result
179
+ end
180
+
181
+ ##
182
+ # Returns a new hash with the results of running the block once for every value.
183
+ # If no block is given, an enumerator is returned instead.
184
+ #
185
+ # @call-seq transform_values {|value| block } -> new_hash
186
+ # @call-seq transform_values -> an_enumerator
187
+ #
188
+ def transform_values
189
+ return enum_for(:transform_values) unless block_given?
190
+ result = {}
191
+ each_pair do |key, value|
192
+ newvalue = yield value
193
+ result[key] = newvalue
194
+ end
195
+ result
196
+ end
197
+
198
+ ##
199
+ # Returns +true+ if the given value is present for some key.
200
+ #
201
+ # @call-seq value?(value) -> true or false
202
+ #
203
+ def value? value
204
+ include? value
205
+ end
206
+ alias has_value? value?
207
+
208
+ ##
209
+ # Returns a new array populated with the values from this enum.
210
+ #
211
+ # @call-seq values -> array
212
+ #
213
+ def values
214
+ to_a
215
+ end
216
+
217
+ ##
218
+ # Return an array containing the values associated with the given keys.
219
+ #
220
+ # @call-seq values_at(key, ...) -> array
221
+ #
222
+ def values_at *keys
223
+ fetch_values(*keys) {|key| nil }
224
+ end
225
+
226
+ end
227
+
228
+
229
+ =begin
230
+ Copyright (c) 2018, Matthew Kerwin <matthew@kerwin.net.au>
231
+
232
+ Permission to use, copy, modify, and/or distribute this software for any
233
+ purpose with or without fee is hereby granted, provided that the above
234
+ copyright notice and this permission notice appear in all copies.
235
+
236
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
237
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
238
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
239
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
240
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
241
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
242
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
243
+ =end
244
+
@@ -1,7 +1,7 @@
1
1
  require 'test/unit'
2
2
  $VERBOSE = true
3
3
 
4
- require_relative '../lib/mug/any-and-all'
4
+ require_relative '../lib/mug/enumerable/any-and-all'
5
5
  class Test_any_and_all < Test::Unit::TestCase
6
6
  def test_any_and_all__block
7
7
  b = proc {|o| o > 1 }
@@ -1,8 +1,8 @@
1
1
  require 'test/unit'
2
2
  $VERBOSE = true
3
3
 
4
- require_relative '../lib/mug/counts'
5
- class Test_hashmap < Test::Unit::TestCase
4
+ require_relative '../lib/mug/enumerable/counts'
5
+ class Test_counts < Test::Unit::TestCase
6
6
  def test_counts
7
7
  a = %w(a b b c c c)
8
8
  c = {'a'=>1, 'b'=>2, 'c'=>3}
@@ -0,0 +1,245 @@
1
+ require 'test/unit'
2
+ $VERBOSE = true
3
+
4
+ class HashLikeEnum
5
+ def each
6
+ return enum_for(:each) unless block_given?
7
+ yield 'a'
8
+ yield 'b'
9
+ yield 'c'
10
+ yield 'd'
11
+ end
12
+ include Enumerable
13
+ end
14
+
15
+ require_relative '../lib/mug/enumerable/hash-like'
16
+ class Test_hashlike < Test::Unit::TestCase
17
+ def test__each_pair__block
18
+ my_enum = HashLikeEnum.new
19
+ expect = [[0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']]
20
+
21
+ my_enum.each_pair do |key, value|
22
+ exp = expect.shift
23
+ assert_equal(exp, [key, value])
24
+ end
25
+ end
26
+
27
+ def test__each_pair
28
+ my_enum = HashLikeEnum.new
29
+ expect = [[0, 'a'], [1, 'b'], [2, 'c'], [3, 'd']]
30
+
31
+ enm = my_enum.each_pair
32
+
33
+ enm.each do |key, value|
34
+ exp = expect.shift
35
+ assert_equal(exp, [key, value])
36
+ end
37
+ end
38
+
39
+ def test__each_key__block
40
+ my_enum = HashLikeEnum.new
41
+ expect = [0, 1, 2, 3]
42
+
43
+ my_enum.each_key do |key|
44
+ exp = expect.shift
45
+ assert_equal(exp, key)
46
+ end
47
+ end
48
+
49
+ def test__each_key
50
+ my_enum = HashLikeEnum.new
51
+ expect = [0, 1, 2, 3]
52
+
53
+ enm = my_enum.each_key
54
+
55
+ enm.each do |key|
56
+ exp = expect.shift
57
+ assert_equal(exp, key)
58
+ end
59
+ end
60
+
61
+ def test__each_value__block
62
+ my_enum = HashLikeEnum.new
63
+ expect = %w[a b c d]
64
+
65
+ my_enum.each_value do |value|
66
+ exp = expect.shift
67
+ assert_equal(exp, value)
68
+ end
69
+ end
70
+
71
+ def test__each_value
72
+ my_enum = HashLikeEnum.new
73
+ expect = %w[a b c d]
74
+
75
+ enm = my_enum.each_value
76
+
77
+ enm.each do |value|
78
+ exp = expect.shift
79
+ assert_equal(exp, value)
80
+ end
81
+ end
82
+
83
+ def test__fetch
84
+ my_enum = HashLikeEnum.new
85
+
86
+ assert_raise(ArgumentError) { my_enum.fetch }
87
+
88
+ assert_equal('a', my_enum.fetch(0))
89
+ assert_equal('d', my_enum.fetch(3))
90
+ assert_raise(KeyError) { my_enum.fetch(5) }
91
+ assert_raise(KeyError) { my_enum.fetch(-1) }
92
+ assert_raise(KeyError) { my_enum.fetch('not a number') }
93
+ end
94
+
95
+ def test__fetch__default
96
+ my_enum = HashLikeEnum.new
97
+ default = 'z'
98
+
99
+ assert_equal('a', my_enum.fetch(0, default))
100
+ assert_equal('d', my_enum.fetch(3, default))
101
+ assert_equal(default, my_enum.fetch(5, default))
102
+ assert_equal(default, my_enum.fetch(-1, default))
103
+ assert_equal(default, my_enum.fetch('not a number', default))
104
+ end
105
+
106
+ def test__fetch__block
107
+ my_enum = HashLikeEnum.new
108
+
109
+ block = proc {|key| key }
110
+
111
+ assert_equal('a', my_enum.fetch(0, &block))
112
+ assert_equal('d', my_enum.fetch(3, &block))
113
+ assert_equal(5, my_enum.fetch(5, &block))
114
+ assert_equal(-1, my_enum.fetch(-1, &block))
115
+ assert_equal('not a number', my_enum.fetch('not a number', &block))
116
+ end
117
+
118
+ def test__fetch__default_block
119
+ my_enum = HashLikeEnum.new
120
+ default = 'z'
121
+
122
+ block = proc {|key| key }
123
+
124
+ assert_equal('a', my_enum.fetch(0, default, &block))
125
+ assert_equal('d', my_enum.fetch(3, default, &block))
126
+ assert_equal(default, my_enum.fetch(5, default, &block))
127
+ assert_equal(default, my_enum.fetch(-1, default, &block))
128
+ assert_equal(default, my_enum.fetch('not a number', default, &block))
129
+ end
130
+
131
+ def test__fetch_values
132
+ my_enum = HashLikeEnum.new
133
+
134
+ assert_equal(%w[a d], my_enum.fetch_values(0, 3))
135
+ assert_equal(%w[a d a d], my_enum.fetch_values(0, 3, 0, 3))
136
+ assert_raise(KeyError) { my_enum.fetch_values(5) }
137
+ assert_raise(KeyError) { my_enum.fetch_values(0, 3, 5) }
138
+ end
139
+
140
+ def test__fetch_values__block
141
+ my_enum = HashLikeEnum.new
142
+
143
+ block = proc {|key| key }
144
+
145
+ assert_equal(%w[a d], my_enum.fetch_values(0, 3, &block))
146
+ assert_equal(%w[a d a d], my_enum.fetch_values(0, 3, 0, 3, &block))
147
+ assert_equal([5], my_enum.fetch_values(5, &block))
148
+ assert_equal(['a', 'd', 5], my_enum.fetch_values(0, 3, 5, &block))
149
+ end
150
+
151
+ def test__key
152
+ my_enum = HashLikeEnum.new
153
+
154
+ assert_equal(0, my_enum.key('a'))
155
+ assert_equal(3, my_enum.key('d'))
156
+ assert_nil(my_enum.key('missing'))
157
+ end
158
+
159
+ def test__keys
160
+ my_enum = HashLikeEnum.new
161
+ expect = [0, 1, 2, 3]
162
+
163
+ assert_equal(expect, my_enum.keys)
164
+ end
165
+
166
+ def test__length
167
+ my_enum = HashLikeEnum.new
168
+ expect = 4
169
+
170
+ assert_equal(expect, my_enum.length)
171
+ end
172
+
173
+ def test__member?
174
+ my_enum = HashLikeEnum.new
175
+
176
+ assert(my_enum.member?(0))
177
+ assert(my_enum.member?(3))
178
+ assert(!my_enum.member?(5))
179
+ assert(!my_enum.member?(-1))
180
+ assert(!my_enum.member?('not a number'))
181
+ end
182
+
183
+ def test__slice
184
+ my_enum = HashLikeEnum.new
185
+
186
+ assert_equal({0=>'a', 3=>'d'}, my_enum.slice(0, 3))
187
+ assert_equal({0=>'a', 3=>'d'}, my_enum.slice(0, 3, 0))
188
+ assert_equal({0=>'a', 3=>'d'}, my_enum.slice(0, 3, 5))
189
+ assert_equal({0=>'a', 3=>'d'}, my_enum.slice(0, 3, -1))
190
+ assert_equal({0=>'a', 3=>'d'}, my_enum.slice(0, 3, 'not a number'))
191
+ assert_equal({}, my_enum.slice())
192
+ end
193
+
194
+ def test__transform_keys
195
+ my_enum = HashLikeEnum.new
196
+
197
+ block = proc {|key| "_#{key}_" }
198
+
199
+ enm = my_enum.transform_keys
200
+ assert_equal({'_0_'=>'a', '_1_'=>'b', '_2_'=>'c', '_3_'=>'d'}, enm.each(&block))
201
+ end
202
+
203
+ def test__transform_keys__block
204
+ my_enum = HashLikeEnum.new
205
+
206
+ block = proc {|key| "_#{key}_" }
207
+
208
+ assert_equal({'_0_'=>'a', '_1_'=>'b', '_2_'=>'c', '_3_'=>'d'}, my_enum.transform_keys(&block))
209
+ end
210
+
211
+ def test__transform_values
212
+ my_enum = HashLikeEnum.new
213
+
214
+ block = proc {|value| value.upcase }
215
+
216
+ enm = my_enum.transform_values
217
+ assert_equal({0=>'A', 1=>'B', 2=>'C', 3=>'D'}, enm.each(&block))
218
+ end
219
+
220
+ def test__transform_values__block
221
+ my_enum = HashLikeEnum.new
222
+
223
+ block = proc {|value| value.upcase }
224
+
225
+ assert_equal({0=>'A', 1=>'B', 2=>'C', 3=>'D'}, my_enum.transform_values(&block))
226
+ end
227
+
228
+ def test__values
229
+ my_enum = HashLikeEnum.new
230
+
231
+ assert_equal(%w[a b c d], my_enum.values)
232
+ end
233
+
234
+ def test__values_at
235
+ my_enum = HashLikeEnum.new
236
+
237
+ assert_equal(%w[a d], my_enum.values_at(0, 3))
238
+ assert_equal(%w[a d a], my_enum.values_at(0, 3, 0))
239
+ assert_equal(['a',nil,'d'], my_enum.values_at(0, 5, 3))
240
+ assert_equal(['a',nil,'d'], my_enum.values_at(0, -1, 3))
241
+ assert_equal(['a',nil,'d'], my_enum.values_at(0, 'not a number', 3))
242
+ assert_equal([], my_enum.values_at())
243
+ end
244
+ end
245
+
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mug
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.0
4
+ version: 0.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthew Kerwin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-05 00:00:00.000000000 Z
11
+ date: 2018-03-12 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  == MUG: Matty's Ultimate Gem
@@ -38,6 +38,10 @@ files:
38
38
  - lib/mug/bool.rb
39
39
  - lib/mug/clamp.rb
40
40
  - lib/mug/counts.rb
41
+ - lib/mug/enumerable.rb
42
+ - lib/mug/enumerable/any-and-all.rb
43
+ - lib/mug/enumerable/counts.rb
44
+ - lib/mug/enumerable/hash-like.rb
41
45
  - lib/mug/fragile-method-chain.rb
42
46
  - lib/mug/hash.rb
43
47
  - lib/mug/hash/map.rb
@@ -78,6 +82,7 @@ files:
78
82
  - test/test-bool.rb
79
83
  - test/test-clamp.rb
80
84
  - test/test-counts.rb
85
+ - test/test-enumerable-hash-like.rb
81
86
  - test/test-fragile-method-chain.rb
82
87
  - test/test-hashmap.rb
83
88
  - test/test-hashmerge.rb
@@ -121,6 +126,7 @@ signing_key:
121
126
  specification_version: 4
122
127
  summary: 'MUG: Matty''s Ultimate Gem'
123
128
  test_files:
129
+ - test/test-enumerable-hash-like.rb
124
130
  - test/test-clamp.rb
125
131
  - test/test-array-delete_all.rb
126
132
  - test/test-rexproc.rb