mug 0.5.3 → 0.5.4

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mug/and-or.rb +26 -26
  3. data/lib/mug/any-and-all.rb +16 -16
  4. data/lib/mug/apply.rb +37 -37
  5. data/lib/mug/array/extend.rb +43 -43
  6. data/lib/mug/array/minus.rb +32 -32
  7. data/lib/mug/bool.rb +71 -71
  8. data/lib/mug/clamp.rb +35 -35
  9. data/lib/mug/counts.rb +27 -27
  10. data/lib/mug/fragile-method-chain.rb +42 -42
  11. data/lib/mug/hash/map.rb +75 -75
  12. data/lib/mug/hash/operations.rb +47 -47
  13. data/lib/mug/iterator/for.rb +7 -7
  14. data/lib/mug/iterator/method.rb +7 -7
  15. data/lib/mug/iterator_c.rb +14 -14
  16. data/lib/mug/loop-with.rb +30 -29
  17. data/lib/mug/matchdata/each.rb +40 -40
  18. data/lib/mug/matchdata/hash.rb +29 -29
  19. data/lib/mug/maybe.rb +33 -33
  20. data/lib/mug/negativity.rb +20 -20
  21. data/lib/mug/not.rb +6 -6
  22. data/lib/mug/rexproc.rb +6 -6
  23. data/lib/mug/self.rb +31 -31
  24. data/lib/mug/to_h.rb +2 -2
  25. data/lib/mug/top.rb +100 -100
  26. data/test/test-and-or.rb +32 -32
  27. data/test/test-any-and-all.rb +19 -19
  28. data/test/test-apply.rb +47 -47
  29. data/test/test-array-extend.rb +54 -54
  30. data/test/test-array-minus.rb +11 -11
  31. data/test/test-bool.rb +48 -48
  32. data/test/test-clamp.rb +42 -42
  33. data/test/test-counts.rb +21 -21
  34. data/test/test-fragile-method-chain.rb +56 -56
  35. data/test/test-hashmap.rb +14 -14
  36. data/test/test-hashop.rb +47 -47
  37. data/test/test-iterator-for.rb +12 -12
  38. data/test/test-loop-with.rb +117 -66
  39. data/test/test-matchdata_each.rb +50 -50
  40. data/test/test-matchdata_hash.rb +40 -40
  41. data/test/test-maybe.rb +76 -76
  42. data/test/test-negativity.rb +40 -40
  43. data/test/test-not.rb +53 -53
  44. data/test/test-rexproc.rb +6 -6
  45. data/test/test-self.rb +21 -21
  46. data/test/test-tau.rb +12 -12
  47. data/test/test-top.rb +100 -100
  48. metadata +4 -4
@@ -1,46 +1,46 @@
1
1
 
2
2
  class Numeric
3
3
 
4
- #
5
- # Clamps num so that lower <= new_num <= higher.
6
- #
7
- # Returns lower when num < lower, higher when num > higher, otherwise
8
- # num itself.
9
- #
10
- # Raises an exception if lower > higher
11
- #
12
- def clamp lower, higher=nil
13
- return lower.bound(self) if lower.is_a?(Range) && higher.nil?
14
- raise ArgumentError, 'range must not be negative' if lower > higher
15
- [[lower, self].max, higher].min
16
- end
4
+ #
5
+ # Clamps num so that lower <= new_num <= higher.
6
+ #
7
+ # Returns lower when num < lower, higher when num > higher, otherwise
8
+ # num itself.
9
+ #
10
+ # Raises an exception if lower > higher
11
+ #
12
+ def clamp lower, higher=nil
13
+ return lower.bound(self) if lower.is_a?(Range) && higher.nil?
14
+ raise ArgumentError, 'range must not be negative' if lower > higher
15
+ [[lower, self].max, higher].min
16
+ end
17
17
 
18
18
  end
19
19
 
20
20
  class Range
21
21
 
22
- #
23
- # Bounds val so that first <= new_val <= last.
24
- #
25
- # Returns first when val < first, last when val > last, otherwise
26
- # val itself.
27
- #
28
- # Raises an exception if val >= end and the range is exclusive.
29
- #
30
- def bound val
31
- a = first
32
- return a if val < a
33
-
34
- b = last
35
- if val >= b
36
- if exclude_end?
37
- raise ArgumentError, 'more than or equal to the exclusive range'
38
- end
39
- return b
40
- end
41
-
42
- val
43
- end
22
+ #
23
+ # Bounds val so that first <= new_val <= last.
24
+ #
25
+ # Returns first when val < first, last when val > last, otherwise
26
+ # val itself.
27
+ #
28
+ # Raises an exception if val >= end and the range is exclusive.
29
+ #
30
+ def bound val
31
+ a = first
32
+ return a if val < a
33
+
34
+ b = last
35
+ if val >= b
36
+ if exclude_end?
37
+ raise ArgumentError, 'more than or equal to the exclusive range'
38
+ end
39
+ return b
40
+ end
41
+
42
+ val
43
+ end
44
44
 
45
45
  end
46
46
 
@@ -1,34 +1,34 @@
1
1
 
2
2
  module Enumerable
3
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
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
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
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
32
 
33
33
  end
34
34
 
@@ -8,55 +8,55 @@
8
8
  # nested_hash._?[:a][:b][:c]._!
9
9
  #
10
10
  class FragileMethodChain
11
- #
12
- # Creates a FragileMethodChain which will send its first method to +o+
13
- #
14
- def initialize o, falsy: true
15
- @o = o
16
- @falsy = falsy
17
- end
11
+ #
12
+ # Creates a FragileMethodChain which will send its first method to +o+
13
+ #
14
+ def initialize o, falsy: true
15
+ @o = o
16
+ @falsy = falsy
17
+ end
18
18
 
19
- #
20
- # Finalises the FragileMethodChain.
21
- #
22
- # The final result will be the first +nil+ or +false+ value
23
- # returned in the chain, or its end result.
24
- #
25
- def _!
26
- @o
27
- end
19
+ #
20
+ # Finalises the FragileMethodChain.
21
+ #
22
+ # The final result will be the first +nil+ or +false+ value
23
+ # returned in the chain, or its end result.
24
+ #
25
+ def _!
26
+ @o
27
+ end
28
28
 
29
- # Delegate the method args/block
30
- def method_missing *a, &b #:nodoc:
31
- if __defer?
32
- @o = @o.__send__(*a, &b)
33
- end
34
- self
35
- end
29
+ # Delegate the method args/block
30
+ def method_missing *a, &b #:nodoc:
31
+ if __defer?
32
+ @o = @o.__send__(*a, &b)
33
+ end
34
+ self
35
+ end
36
36
 
37
- # Explicitly invoke :_? as a method in the chain.
38
- def _? #:nodoc:
39
- # Unconditionally invoke it, so the eventual _! doesn't fail
40
- #if __defer?
41
- @o = @o.__send__(:_?)
42
- #end
43
- self
44
- end
37
+ # Explicitly invoke :_? as a method in the chain.
38
+ def _? #:nodoc:
39
+ # Unconditionally invoke it, so the eventual _! doesn't fail
40
+ #if __defer?
41
+ @o = @o.__send__(:_?)
42
+ #end
43
+ self
44
+ end
45
45
 
46
- # Return true iff @o is deferable.
47
- def __defer?
48
- return @o if @falsy
49
- ! @o.nil?
50
- end
46
+ # Return true iff @o is deferable.
47
+ def __defer?
48
+ return @o if @falsy
49
+ ! @o.nil?
50
+ end
51
51
  end
52
52
 
53
53
  class Object
54
- #
55
- # Begins a FragileMethodChain.
56
- #
57
- def _?
58
- FragileMethodChain.new(self)
59
- end
54
+ #
55
+ # Begins a FragileMethodChain.
56
+ #
57
+ def _?
58
+ FragileMethodChain.new(self)
59
+ end
60
60
  end
61
61
 
62
62
  =begin
@@ -1,85 +1,85 @@
1
1
 
2
2
  class Hash
3
- #
4
- # Returns a new hash which is a copy of the current hash but each
5
- # value is replaced by the result of running it through +block+.
6
- #
7
- # {'a'=>1, 'b'=>2}.map_values { |v| v*2 } #=> {'a'=>2, 'b'=>4}
8
- # {'a'=>1, 'b'=>2}.map_values { "cat" } #=> {'a'=>"cat", 'b'=>"cat"}
9
- #
10
- def map_values &block # :yields: value
11
- hsh = {}
12
- each do |k, v|
13
- hsh[k] = yield v
14
- end
15
- hsh
16
- end
3
+ #
4
+ # Returns a new hash which is a copy of the current hash but each
5
+ # value is replaced by the result of running it through +block+.
6
+ #
7
+ # {'a'=>1, 'b'=>2}.map_values { |v| v*2 } #=> {'a'=>2, 'b'=>4}
8
+ # {'a'=>1, 'b'=>2}.map_values { "cat" } #=> {'a'=>"cat", 'b'=>"cat"}
9
+ #
10
+ def map_values &block # :yields: value
11
+ hsh = {}
12
+ each do |k, v|
13
+ hsh[k] = yield v
14
+ end
15
+ hsh
16
+ end
17
17
 
18
- #
19
- # Replaces the values in +hsh+ by running them each through +block+.
20
- #
21
- # See: #map_values
22
- #
23
- def map_values! &block # :yields: value
24
- replace map_values(&block)
25
- end
18
+ #
19
+ # Replaces the values in +hsh+ by running them each through +block+.
20
+ #
21
+ # See: #map_values
22
+ #
23
+ def map_values! &block # :yields: value
24
+ replace map_values(&block)
25
+ end
26
26
 
27
- #
28
- # Returns a new hash which is a copy of the current hash but each
29
- # key is replaced by the result of running it through +block+.
30
- #
31
- # If +block+ returns duplicate keys, they will be overwritten in
32
- # the resulting hash.
33
- #
34
- # {'a'=>1, 'b'=>2}.map_keys { |k| k*2 } #=> {'aa'=>1, 'bb'=>2}
35
- # {'a'=>1, 'b'=>2}.map_keys { "cat" } #=> {'cat'=>2}
36
- #
37
- def map_keys &block # :yields: key
38
- hsh = {}
39
- each do |k, v|
40
- hsh[ yield k ] = v
41
- end
42
- hsh
43
- end
27
+ #
28
+ # Returns a new hash which is a copy of the current hash but each
29
+ # key is replaced by the result of running it through +block+.
30
+ #
31
+ # If +block+ returns duplicate keys, they will be overwritten in
32
+ # the resulting hash.
33
+ #
34
+ # {'a'=>1, 'b'=>2}.map_keys { |k| k*2 } #=> {'aa'=>1, 'bb'=>2}
35
+ # {'a'=>1, 'b'=>2}.map_keys { "cat" } #=> {'cat'=>2}
36
+ #
37
+ def map_keys &block # :yields: key
38
+ hsh = {}
39
+ each do |k, v|
40
+ hsh[ yield k ] = v
41
+ end
42
+ hsh
43
+ end
44
44
 
45
- #
46
- # Replaces the keys in +hsh+ by running them each through +block+.
47
- #
48
- # If +block+ returns duplicate keys, they will be overwritten in turn.
49
- #
50
- # See: #map_keys
51
- #
52
- def map_keys! &block # :yields: key
53
- replace map_keys(&block)
54
- end
45
+ #
46
+ # Replaces the keys in +hsh+ by running them each through +block+.
47
+ #
48
+ # If +block+ returns duplicate keys, they will be overwritten in turn.
49
+ #
50
+ # See: #map_keys
51
+ #
52
+ def map_keys! &block # :yields: key
53
+ replace map_keys(&block)
54
+ end
55
55
 
56
- #
57
- # Returns a new hash which is a copy of the current hash but each
58
- # key-value pair is replaced by the result of running it through +block+.
59
- #
60
- # If +block+ returns duplicate keys, they will be overwritten in
61
- # the resulting hash.
62
- #
63
- # {'a'=>1, 'b'=>2}.map_pairs { |k,v| [k*2, v+1] } #=> {'aa'=>2, 'bb'=>3}
64
- # {'a'=>1, 'b'=>2}.map_pairs { ["cat","dog"] } #=> {'cat'=>'dog'}
65
- #
66
- def map_pairs &block # :yields: key, value
67
- hsh = {}
68
- each do |k, v|
69
- a, b = yield k, v
70
- hsh[a] = b
71
- end
72
- hsh
73
- end
56
+ #
57
+ # Returns a new hash which is a copy of the current hash but each
58
+ # key-value pair is replaced by the result of running it through +block+.
59
+ #
60
+ # If +block+ returns duplicate keys, they will be overwritten in
61
+ # the resulting hash.
62
+ #
63
+ # {'a'=>1, 'b'=>2}.map_pairs { |k,v| [k*2, v+1] } #=> {'aa'=>2, 'bb'=>3}
64
+ # {'a'=>1, 'b'=>2}.map_pairs { ["cat","dog"] } #=> {'cat'=>'dog'}
65
+ #
66
+ def map_pairs &block # :yields: key, value
67
+ hsh = {}
68
+ each do |k, v|
69
+ a, b = yield k, v
70
+ hsh[a] = b
71
+ end
72
+ hsh
73
+ end
74
74
 
75
- #
76
- # Replaces the values in +hsh+ by running them each through +block+.
77
- #
78
- # See: #map_values
79
- #
80
- def map_pairs! &block # :yields: key, value
81
- replace map_pairs(&block)
82
- end
75
+ #
76
+ # Replaces the values in +hsh+ by running them each through +block+.
77
+ #
78
+ # See: #map_values
79
+ #
80
+ def map_pairs! &block # :yields: key, value
81
+ replace map_pairs(&block)
82
+ end
83
83
  end
84
84
 
85
85
  =begin
@@ -1,54 +1,54 @@
1
1
 
2
2
  class Hash
3
3
 
4
- #
5
- # Returns a new Hash, whose value is the same as this
6
- # one, with any extras in +other_hash+ added in.
7
- #
8
- # Useful for default options.
9
- #
10
- # Example:
11
- # opts = {:a => 1, :b => 2 }
12
- # dflt = {:a => 0, :x => 9 }
13
- # opts |= dflt # => opts = {:a=>1, :b=>2, :x=>9}
14
- #
15
- def | other_hash
16
- other_hash.merge self
17
- end
4
+ #
5
+ # Returns a new Hash, whose value is the same as this
6
+ # one, with any extras in +other_hash+ added in.
7
+ #
8
+ # Useful for default options.
9
+ #
10
+ # Example:
11
+ # opts = {:a => 1, :b => 2 }
12
+ # dflt = {:a => 0, :x => 9 }
13
+ # opts |= dflt # => opts = {:a=>1, :b=>2, :x=>9}
14
+ #
15
+ def | other_hash
16
+ other_hash.merge self
17
+ end
18
18
 
19
- #
20
- # Adds the contents of +other_hash+ to +hsh+.
21
- # Entries with duplicate keys are overwritten with the
22
- # values from +other_hash+
23
- #
24
- def + other_hash
25
- merge other_hash
26
- end
19
+ #
20
+ # Adds the contents of +other_hash+ to +hsh+.
21
+ # Entries with duplicate keys are overwritten with the
22
+ # values from +other_hash+
23
+ #
24
+ def + other_hash
25
+ merge other_hash
26
+ end
27
27
 
28
- #
29
- # Appends stuff to the hash.
30
- #
31
- # If +o+ is a Hash, this is identical to calling #merge!
32
- # If +o+ is an Array with two elements, it is interpreted as [key,value]
33
- # If +o+ can be converted to a hash with #to_h, this is identical to calling #merge!
34
- # Otherwise an ArgumentError is raised.
35
- #
36
- # Example:
37
- # h = {}
38
- # h << {:a=>0} # h = {:a=>0}
39
- # h << {:b=>2,:c=>3} # h = {:a=>0,:b=>2,:c=>3}
40
- # h << [:a,1] # h = {:a=>1,:b=>2,:c=>3}
41
- #
42
- def << o
43
- if o.respond_to? :to_hash
44
- merge! o.to_hash
45
- elsif o.respond_to?(:to_a) && (a = o.to_a) && a.length == 2
46
- tap { store a[0], a[1] }
47
- elsif o.respond_to? :to_h
48
- merge! o.to_h
49
- else
50
- raise ArgumentError, "#{o.class.name} is not a Hash"
51
- end
52
- end
28
+ #
29
+ # Appends stuff to the hash.
30
+ #
31
+ # If +o+ is a Hash, this is identical to calling #merge!
32
+ # If +o+ is an Array with two elements, it is interpreted as [key,value]
33
+ # If +o+ can be converted to a hash with #to_h, this is identical to calling #merge!
34
+ # Otherwise an ArgumentError is raised.
35
+ #
36
+ # Example:
37
+ # h = {}
38
+ # h << {:a=>0} # h = {:a=>0}
39
+ # h << {:b=>2,:c=>3} # h = {:a=>0,:b=>2,:c=>3}
40
+ # h << [:a,1] # h = {:a=>1,:b=>2,:c=>3}
41
+ #
42
+ def << o
43
+ if o.respond_to? :to_hash
44
+ merge! o.to_hash
45
+ elsif o.respond_to?(:to_a) && (a = o.to_a) && a.length == 2
46
+ tap { store a[0], a[1] }
47
+ elsif o.respond_to? :to_h
48
+ merge! o.to_h
49
+ else
50
+ raise ArgumentError, "#{o.class.name} is not a Hash"
51
+ end
52
+ end
53
53
  end
54
54