sixarm_ruby_ramp 4.1.0 → 4.2.2
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/README.md +30 -6
- data/VERSION +1 -1
- data/lib/sixarm_ruby_ramp/array/join.rb +67 -0
- data/lib/sixarm_ruby_ramp/array/shuffle.rb +49 -0
- data/lib/sixarm_ruby_ramp/array.rb +14 -121
- data/lib/sixarm_ruby_ramp/enumerable/map.rb +114 -0
- data/lib/sixarm_ruby_ramp/enumerable/nitems.rb +66 -0
- data/lib/sixarm_ruby_ramp/enumerable/select.rb +50 -0
- data/lib/sixarm_ruby_ramp/enumerable.rb +1 -124
- data/lib/sixarm_ruby_ramp/integer/rbit.rb +23 -0
- data/lib/sixarm_ruby_ramp.rb +30 -1
- data/test/sixarm_ruby_ramp_test/array/join_test.rb +37 -0
- data/test/sixarm_ruby_ramp_test/array/shuffle_test.rb +26 -0
- data/test/sixarm_ruby_ramp_test/array_test.rb +10 -59
- data/test/sixarm_ruby_ramp_test/enumerable/map_test.rb +42 -0
- data/test/sixarm_ruby_ramp_test/enumerable/nitems_test.rb +48 -0
- data/test/sixarm_ruby_ramp_test/enumerable/select_test.rb +33 -0
- data/test/sixarm_ruby_ramp_test/enumerable_test.rb +0 -136
- data/test/sixarm_ruby_ramp_test/integer/rbit_test.rb +43 -0
- data/test/sixarm_ruby_ramp_test/integer_test.rb +0 -1
- data/test/sixarm_ruby_ramp_test.rb +30 -1
- data.tar.gz.sig +0 -0
- metadata +55 -22
- metadata.gz.sig +0 -0
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a821169d3c371f60d7d48f2084ee1b6cceceecd9
         | 
| 4 | 
            +
              data.tar.gz: 96510d04fe9d8bb4d695c3e101cab563653310c6
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a5ece89814f03fd98c3c2f1d87d682828a90ba79e48d7a4122be16bc2af3ee208ab36f2de4c0ef3d247c8c65af482b46a3710a6a980cf80bf66eb037de170209
         | 
| 7 | 
            +
              data.tar.gz: 601811bc53253b62be8c3c8ef88f653f78c72c9bc6101954c7109a3bc91369141fa543de13910fc3ead9981b8145c408442c7f83b430d4e59ef6ea28e0582352
         | 
    
        checksums.yaml.gz.sig
    CHANGED
    
    | Binary file | 
    
        data/README.md
    CHANGED
    
    | @@ -28,7 +28,7 @@ Install: | |
| 28 28 |  | 
| 29 29 | 
             
            Bundler:
         | 
| 30 30 |  | 
| 31 | 
            -
                gem "sixarm_ruby_ramp", ">=4. | 
| 31 | 
            +
                gem "sixarm_ruby_ramp", ">=4.2.2", "<5"
         | 
| 32 32 |  | 
| 33 33 | 
             
            Require:
         | 
| 34 34 |  | 
| @@ -54,7 +54,6 @@ To install with high security: | |
| 54 54 | 
             
            * choice, choices: one or more random elements from an array
         | 
| 55 55 | 
             
            * cross: return the cross pairings of an array with another array
         | 
| 56 56 | 
             
            * divvy: divides an array, like a pie, into a specified number of slices (deprecated - see method rdoc)
         | 
| 57 | 
            -
            * join, join_prefix_suffix, join_prefix_suffix_infix: like Array#join with improvements
         | 
| 58 57 | 
             
            * onto: return a hash that maps an array's keys on to another array's values
         | 
| 59 58 | 
             
            * rotate: moves the first element of an array to the end
         | 
| 60 59 | 
             
            * rest: return the rest of the items of the array (aka cdr, aka shifted)
         | 
| @@ -67,6 +66,13 @@ To install with high security: | |
| 67 66 | 
             
            * union: builds an array containing each of the unique elements of sub-arrays ([[1,2,3,4],[2,3,4,5],[3,4,5,6]].union => [1,2,3,4,5,6])
         | 
| 68 67 |  | 
| 69 68 |  | 
| 69 | 
            +
            ### Array join
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            * join: enhances #join with optional prefix, suffix, and infix.
         | 
| 72 | 
            +
            * join_prefix_suffix: join with a prefix and suffix.
         | 
| 73 | 
            +
            * join_prefix_suffix_infix: join with a prefix, suffix, and infix.
         | 
| 74 | 
            +
             | 
| 75 | 
            +
             | 
| 70 76 | 
             
            ## Class
         | 
| 71 77 |  | 
| 72 78 | 
             
            * publicize_methods: make all methods public for a block, e.g. to unit test private methods
         | 
| @@ -93,13 +99,28 @@ To install with high security: | |
| 93 99 | 
             
            * join: forwards to self.to_a.join
         | 
| 94 100 | 
             
            * to_h: convert the object to a hash by mapping each item to a key=>value pair.
         | 
| 95 101 | 
             
            * to_h_merge: convert the object to a hash by mapping each item to a key=>value pair, merging any duplicate keys.
         | 
| 102 | 
            +
            * power_set: return an array with all subsets of the enum's elements
         | 
| 103 | 
            +
             | 
| 104 | 
            +
             | 
| 105 | 
            +
            ### Enumerable map
         | 
| 106 | 
            +
             | 
| 96 107 | 
             
            * map_id: return the id of an Enumerable object; *requires* that the object respond to an 'id' message
         | 
| 97 108 | 
             
            * map_to_a, map_to_f, map_to_i, map_to_s, map_to_sym: convert each object to a specific type by calling its respective method to_a, to_i, to_f, to_s, to_sym
         | 
| 98 109 | 
             
            * map_with_index: for each item, yield to a block with the item and its incrementing index
         | 
| 99 | 
            -
             | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 110 | 
            +
             | 
| 111 | 
            +
             | 
| 112 | 
            +
            ### Enumerable nitems
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            * nitems_while: the number of leading elements for which block is truthy.
         | 
| 115 | 
            +
            * nitems_until: the number of leading elements for which block is falsey.
         | 
| 116 | 
            +
            * nitems_with_index: the number of leading elements for which block with index is truthy.
         | 
| 117 | 
            +
             | 
| 118 | 
            +
             | 
| 119 | 
            +
            ### Enumerable select
         | 
| 120 | 
            +
             | 
| 121 | 
            +
            * select_while: return an array of the leading elements for which block is truthy.
         | 
| 122 | 
            +
            * select_until: return an array of the leading elements for which block is falsey.
         | 
| 123 | 
            +
            * select_with_index: return an array of the leading elements for which block with index is truthy.
         | 
| 103 124 |  | 
| 104 125 |  | 
| 105 126 | 
             
            ## File
         | 
| @@ -131,6 +152,7 @@ To install with high security: | |
| 131 152 |  | 
| 132 153 | 
             
            ## Integer
         | 
| 133 154 |  | 
| 155 | 
            +
            * rbit: reverse bit
         | 
| 134 156 | 
             
            * maps: syntactic sugar to yield n times to a block, returning an array of any results
         | 
| 135 157 | 
             
            * odd?: is the number odd?
         | 
| 136 158 |  | 
| @@ -229,6 +251,8 @@ Extensions that help debug Ruby programs. | |
| 229 251 |  | 
| 230 252 | 
             
            ## Changes
         | 
| 231 253 |  | 
| 254 | 
            +
            * 2015-03-14 4.2.1 Conditionally load `Array#shuffle*`
         | 
| 255 | 
            +
            * 2015-03-14 4.2.0 Add `Integer#rbit`
         | 
| 232 256 | 
             
            * 2015-01-13 4.1.0 Fix Enumerable `to_h` and add `to_h_merge`
         | 
| 233 257 | 
             
            * 2015-01-13 4.0.1 Fix for Process.ps keys
         | 
| 234 258 | 
             
            * 2014-12-17 4.0.0 Add `Pairable` methods; change semantics of `Hash#map_pair`; change `to_h` for Ruby 2.2.0
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            4. | 
| 1 | 
            +
            4.2.2
         | 
| @@ -0,0 +1,67 @@ | |
| 1 | 
            +
            class Array
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # Alias join because we're going to override it
         | 
| 4 | 
            +
              alias :ruby_join :join
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              # Concatenate the items into a string by join.
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @return [String] concatenated string
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              # @example Join with infix
         | 
| 11 | 
            +
              #   list=['a','b','c']
         | 
| 12 | 
            +
              #   list.join("*") => "a*b*c"
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # @example Join with prefix and suffix
         | 
| 15 | 
            +
              #   list=['a','b','c']
         | 
| 16 | 
            +
              #   list.join("[","]") => "[a][b][c]"
         | 
| 17 | 
            +
              #
         | 
| 18 | 
            +
              # @example Join with prefix, suffix, and infix
         | 
| 19 | 
            +
              #   list=['a','b','c']
         | 
| 20 | 
            +
              #   list.join("*","[","]") => "[a]*[b]*[c]"
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              def join(*fixes)
         | 
| 23 | 
            +
                if fixes.is_a?(String) then return self.ruby_join(fixes) end
         | 
| 24 | 
            +
                return case fixes.size
         | 
| 25 | 
            +
                when 0
         | 
| 26 | 
            +
                  ruby_join
         | 
| 27 | 
            +
                when 1
         | 
| 28 | 
            +
                  ruby_join(fixes[0].to_s)
         | 
| 29 | 
            +
                when 2
         | 
| 30 | 
            +
                  join_prefix_suffix(*fixes)
         | 
| 31 | 
            +
                when 3
         | 
| 32 | 
            +
                  join_prefix_suffix_infix(*fixes)
         | 
| 33 | 
            +
                else
         | 
| 34 | 
            +
                  raise ArgumentError, "join() takes 0-3 arguments; you gave #{fixes.size}]"
         | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              # Concatenate the items by joining using a prefix string and suffix string.
         | 
| 39 | 
            +
              #
         | 
| 40 | 
            +
              # @return [String] concatenated string
         | 
| 41 | 
            +
              #
         | 
| 42 | 
            +
              # @example
         | 
| 43 | 
            +
              #   list=['a','b','c']
         | 
| 44 | 
            +
              #   list.join("[","]") => "[a][b][c]"
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
              def join_prefix_suffix(prefix, suffix)
         | 
| 47 | 
            +
                prefix = prefix.to_s
         | 
| 48 | 
            +
                suffix = suffix.to_s
         | 
| 49 | 
            +
                return self.map{|item| prefix + item.to_s + suffix}.ruby_join()
         | 
| 50 | 
            +
              end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
              # Concatenate the items by joining using a prefix string, suffix string, and infix string.
         | 
| 53 | 
            +
              #
         | 
| 54 | 
            +
              # @return [String] concatenated string
         | 
| 55 | 
            +
              #
         | 
| 56 | 
            +
              # @example
         | 
| 57 | 
            +
              #   list=['a','b','c']
         | 
| 58 | 
            +
              #   list.join("*","[","]") => "[a]*[b]*[c]"
         | 
| 59 | 
            +
              #
         | 
| 60 | 
            +
              def join_prefix_suffix_infix(prefix, suffix, infix)
         | 
| 61 | 
            +
                prefix = prefix.to_s
         | 
| 62 | 
            +
                suffix = suffix.to_s
         | 
| 63 | 
            +
                infix = infix.to_s
         | 
| 64 | 
            +
                return self.map{|item| prefix + item.to_s + suffix}.ruby_join(infix)
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            end
         | 
| @@ -0,0 +1,49 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            class Array
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              unless method_defined? :shuffle
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                # Randomly arrange the array items.
         | 
| 8 | 
            +
                #
         | 
| 9 | 
            +
                # @return [Array] a new array with the items shuffled.
         | 
| 10 | 
            +
                #
         | 
| 11 | 
            +
                # This implementation is optimized for speed, not for memory use.
         | 
| 12 | 
            +
                # See http://codeidol.com/other/rubyckbk/Arrays/Shuffling-an-Array/
         | 
| 13 | 
            +
                #
         | 
| 14 | 
            +
                # @example
         | 
| 15 | 
            +
                #   list=
         | 
| 16 | 
            +
                #   list=['a','b','c']
         | 
| 17 | 
            +
                #   list.shuffle!
         | 
| 18 | 
            +
                #   list => ['c','a','b']
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def shuffle
         | 
| 21 | 
            +
                  dup.shuffle!
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              unless method_defined? :shuffle!
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                # Randomly arrange the array items.
         | 
| 29 | 
            +
                #
         | 
| 30 | 
            +
                # @return [Array] the array, with its items shuffled.
         | 
| 31 | 
            +
                #
         | 
| 32 | 
            +
                # This implementation is optimized for speed, not for memory use.
         | 
| 33 | 
            +
                # See http://codeidol.com/other/rubyckbk/Arrays/Shuffling-an-Array/
         | 
| 34 | 
            +
                #
         | 
| 35 | 
            +
                # @example
         | 
| 36 | 
            +
                #   list=
         | 
| 37 | 
            +
                #   list=['a','b','c']
         | 
| 38 | 
            +
                #   list.shuffle!
         | 
| 39 | 
            +
                #   list => ['c','a','b']
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                def shuffle!
         | 
| 42 | 
            +
                  each_index do |i|
         | 
| 43 | 
            +
                    j = rand(length-i) + i
         | 
| 44 | 
            +
                    self[j], self[i] = self[i], self[j]
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
              end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            end
         | 
| @@ -1,78 +1,8 @@ | |
| 1 1 | 
             
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            -
             | 
| 3 2 | 
             
            require 'csv'
         | 
| 4 | 
            -
             
         | 
| 5 | 
            -
            # Array extensions
         | 
| 6 3 |  | 
| 7 4 | 
             
            class Array
         | 
| 8 5 |  | 
| 9 | 
            -
             | 
| 10 | 
            -
              # Alias join because we're going to override it
         | 
| 11 | 
            -
             | 
| 12 | 
            -
              alias :ruby_join :join
         | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
              # Concatenate the items into a string by join.
         | 
| 16 | 
            -
              #
         | 
| 17 | 
            -
              # @return [String] concatenated string
         | 
| 18 | 
            -
              #
         | 
| 19 | 
            -
              # @example Join with infix
         | 
| 20 | 
            -
              #   list=['a','b','c']
         | 
| 21 | 
            -
              #   list.join("*") => "a*b*c"
         | 
| 22 | 
            -
              #
         | 
| 23 | 
            -
              # @example Join with prefix and suffix
         | 
| 24 | 
            -
              #   list=['a','b','c']
         | 
| 25 | 
            -
              #   list.join("[","]") => "[a][b][c]"
         | 
| 26 | 
            -
              #
         | 
| 27 | 
            -
              # @example Join with prefix, suffix, and infix
         | 
| 28 | 
            -
              #   list=['a','b','c']
         | 
| 29 | 
            -
              #   list.join("*","[","]") => "[a]*[b]*[c]"
         | 
| 30 | 
            -
              #
         | 
| 31 | 
            -
              def join(*fixes)
         | 
| 32 | 
            -
                if fixes.is_a?(String) then return self.ruby_join(fixes) end
         | 
| 33 | 
            -
                return case fixes.size
         | 
| 34 | 
            -
                when 0
         | 
| 35 | 
            -
                  ruby_join
         | 
| 36 | 
            -
                when 1
         | 
| 37 | 
            -
                  ruby_join(fixes[0].to_s)
         | 
| 38 | 
            -
                when 2
         | 
| 39 | 
            -
                  join_prefix_suffix(*fixes)
         | 
| 40 | 
            -
                when 3
         | 
| 41 | 
            -
                  join_prefix_suffix_infix(*fixes)
         | 
| 42 | 
            -
                else
         | 
| 43 | 
            -
                  raise ArgumentError, "join() takes 0-3 arguments; you gave #{fixes.size}]"
         | 
| 44 | 
            -
                end
         | 
| 45 | 
            -
              end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
              # Concatenate the items by joining using a prefix string and suffix string.
         | 
| 48 | 
            -
              #
         | 
| 49 | 
            -
              # @return [String] concatenated string
         | 
| 50 | 
            -
              #
         | 
| 51 | 
            -
              # @example
         | 
| 52 | 
            -
              #   list=['a','b','c']
         | 
| 53 | 
            -
              #   list.join("[","]") => "[a][b][c]"
         | 
| 54 | 
            -
              #
         | 
| 55 | 
            -
              def join_prefix_suffix(prefix, suffix)
         | 
| 56 | 
            -
                prefix = prefix.to_s
         | 
| 57 | 
            -
                suffix = suffix.to_s
         | 
| 58 | 
            -
                return self.map{|item| prefix + item.to_s + suffix}.ruby_join()
         | 
| 59 | 
            -
              end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
              # Concatenate the items by joining using a prefix string, suffix string, and infix string.
         | 
| 62 | 
            -
              #
         | 
| 63 | 
            -
              # @return [String] concatenated string
         | 
| 64 | 
            -
              #
         | 
| 65 | 
            -
              # @example
         | 
| 66 | 
            -
              #   list=['a','b','c']
         | 
| 67 | 
            -
              #   list.join("*","[","]") => "[a]*[b]*[c]"
         | 
| 68 | 
            -
              #
         | 
| 69 | 
            -
              def join_prefix_suffix_infix(prefix, suffix, infix)
         | 
| 70 | 
            -
                prefix = prefix.to_s
         | 
| 71 | 
            -
                suffix = suffix.to_s
         | 
| 72 | 
            -
                infix = infix.to_s
         | 
| 73 | 
            -
                return self.map{|item| prefix + item.to_s + suffix}.ruby_join(infix)
         | 
| 74 | 
            -
              end
         | 
| 75 | 
            -
             | 
| 76 6 | 
             
              # @return [Boolean] true if size > 0
         | 
| 77 7 | 
             
              #
         | 
| 78 8 | 
             
              # @example
         | 
| @@ -92,7 +22,7 @@ class Array | |
| 92 22 | 
             
              #   [].rotate! => []
         | 
| 93 23 | 
             
              #
         | 
| 94 24 | 
             
              # @return [Array] self
         | 
| 95 | 
            -
             | 
| 25 | 
            +
             | 
| 96 26 | 
             
              def rotate!
         | 
| 97 27 | 
             
                if size>0
         | 
| 98 28 | 
             
                  push item=shift
         | 
| @@ -100,7 +30,7 @@ class Array | |
| 100 30 | 
             
                self
         | 
| 101 31 | 
             
              end
         | 
| 102 32 |  | 
| 103 | 
            -
             | 
| 33 | 
            +
             | 
| 104 34 | 
             
              # @return [Object] a random item from the array
         | 
| 105 35 | 
             
              #
         | 
| 106 36 | 
             
              # @example
         | 
| @@ -109,7 +39,7 @@ class Array | |
| 109 39 | 
             
              #   [1,2,3,4].choice => 3
         | 
| 110 40 | 
             
              #
         | 
| 111 41 | 
             
              # Implemented in Ruby 1.9
         | 
| 112 | 
            -
             | 
| 42 | 
            +
             | 
| 113 43 | 
             
              def choice
         | 
| 114 44 | 
             
                self[Kernel.rand(size)]
         | 
| 115 45 | 
             
              end
         | 
| @@ -120,7 +50,7 @@ class Array | |
| 120 50 | 
             
              # @example
         | 
| 121 51 | 
             
              #   [1,2,3,4].choices(2) => [3,1]
         | 
| 122 52 | 
             
              #   [1,2,3,4].choices(3) => [4,2,3]
         | 
| 123 | 
            -
             | 
| 53 | 
            +
             | 
| 124 54 | 
             
              def choices(count)
         | 
| 125 55 | 
             
                arr = Array.new
         | 
| 126 56 | 
             
                count.times { arr << self.choice }
         | 
| @@ -139,13 +69,13 @@ class Array | |
| 139 69 | 
             
              # This is identical to calling foo.zip(values).to_h
         | 
| 140 70 |  | 
| 141 71 | 
             
              def onto(values)
         | 
| 142 | 
            -
                size==values.size or raise ArgumentError, "Array size #{size} must match values size #{size}" | 
| 72 | 
            +
                size==values.size or raise ArgumentError, "Array size #{size} must match values size #{size}"
         | 
| 143 73 | 
             
                zip(values).to_h
         | 
| 144 74 | 
             
              end
         | 
| 145 75 |  | 
| 146 76 |  | 
| 147 77 | 
             
              ##############################################################
         | 
| 148 | 
            -
              # | 
| 78 | 
            +
              #
         | 
| 149 79 | 
             
              # GROUPINGS
         | 
| 150 80 | 
             
              #
         | 
| 151 81 | 
             
              ##############################################################
         | 
| @@ -166,12 +96,12 @@ class Array | |
| 166 96 |  | 
| 167 97 |  | 
| 168 98 | 
             
              ##############################################################
         | 
| 169 | 
            -
              # | 
| 99 | 
            +
              #
         | 
| 170 100 | 
             
              # COMBINATIONS
         | 
| 171 101 | 
             
              #
         | 
| 172 102 | 
             
              ##############################################################
         | 
| 173 103 |  | 
| 174 | 
            -
             | 
| 104 | 
            +
             | 
| 175 105 | 
             
              # @return [Array] the union of the array's items.
         | 
| 176 106 | 
             
              #
         | 
| 177 107 | 
             
              # In typical use, each item is an array.
         | 
| @@ -212,10 +142,10 @@ class Array | |
| 212 142 | 
             
                inject{|inj,item| inj & item.to_a } || []
         | 
| 213 143 | 
             
              end
         | 
| 214 144 |  | 
| 215 | 
            -
             | 
| 145 | 
            +
             | 
| 216 146 |  | 
| 217 147 | 
             
              ##############################################################
         | 
| 218 | 
            -
              # | 
| 148 | 
            +
              #
         | 
| 219 149 | 
             
              # LIST PROCESSING
         | 
| 220 150 | 
             
              #
         | 
| 221 151 | 
             
              ##############################################################
         | 
| @@ -256,7 +186,7 @@ class Array | |
| 256 186 | 
             
              # Delete the first _number_of_items_ items.
         | 
| 257 187 | 
             
              #
         | 
| 258 188 | 
             
              # @return [Array] the array, minus the deleted items.
         | 
| 259 | 
            -
              # | 
| 189 | 
            +
              #
         | 
| 260 190 | 
             
              # @example
         | 
| 261 191 | 
             
              #   list=['a','b','c']
         | 
| 262 192 | 
             
              #   list.shifted!
         | 
| @@ -280,45 +210,8 @@ class Array | |
| 280 210 | 
             
              alias :rest! :shifted!
         | 
| 281 211 |  | 
| 282 212 |  | 
| 283 | 
            -
              # Randomly arrange the array items.
         | 
| 284 | 
            -
              #
         | 
| 285 | 
            -
              # @return [Array] the array, with its items shuffled.
         | 
| 286 | 
            -
              #
         | 
| 287 | 
            -
              # This implementation is optimized for speed, not for memory use.
         | 
| 288 | 
            -
              # See http://codeidol.com/other/rubyckbk/Arrays/Shuffling-an-Array/
         | 
| 289 | 
            -
              #
         | 
| 290 | 
            -
              # @example
         | 
| 291 | 
            -
              #   list=
         | 
| 292 | 
            -
              #   list=['a','b','c']
         | 
| 293 | 
            -
              #   list.shuffle!
         | 
| 294 | 
            -
              #   list => ['c','a','b']
         | 
| 295 | 
            -
             | 
| 296 | 
            -
              def shuffle!  
         | 
| 297 | 
            -
                each_index do |i| 
         | 
| 298 | 
            -
                  j = rand(length-i) + i
         | 
| 299 | 
            -
                  self[j], self[i] = self[i], self[j]  
         | 
| 300 | 
            -
                end
         | 
| 301 | 
            -
              end
         | 
| 302 | 
            -
             | 
| 303 | 
            -
             | 
| 304 | 
            -
              # @return [Array] a new array with the items shuffled.
         | 
| 305 | 
            -
              #
         | 
| 306 | 
            -
              # This implementation is optimized for speed, not for memory use.
         | 
| 307 | 
            -
              # See http://codeidol.com/other/rubyckbk/Arrays/Shuffling-an-Array/
         | 
| 308 | 
            -
              #
         | 
| 309 | 
            -
              # @example
         | 
| 310 | 
            -
              #   list=
         | 
| 311 | 
            -
              #   list=['a','b','c']
         | 
| 312 | 
            -
              #   list.shuffle!
         | 
| 313 | 
            -
              #   list => ['c','a','b']
         | 
| 314 | 
            -
             | 
| 315 | 
            -
              def shuffle  
         | 
| 316 | 
            -
                dup.shuffle!  
         | 
| 317 | 
            -
              end
         | 
| 318 | 
            -
             | 
| 319 | 
            -
             | 
| 320 213 | 
             
              ##############################################################
         | 
| 321 | 
            -
              # | 
| 214 | 
            +
              #
         | 
| 322 215 | 
             
              # CASTS
         | 
| 323 216 | 
             
              #
         | 
| 324 217 | 
             
              ##############################################################
         | 
| @@ -334,7 +227,7 @@ class Array | |
| 334 227 | 
             
              #   [[1,2,3],[4,5,6]] => "1,2,3\n4,5,6\n"
         | 
| 335 228 | 
             
              #
         | 
| 336 229 | 
             
              # @example of a blank array
         | 
| 337 | 
            -
              # | 
| 230 | 
            +
              #
         | 
| 338 231 | 
             
              #   [].to_csv => ""
         | 
| 339 232 | 
             
              #
         | 
| 340 233 | 
             
              # N.b. this method uses the multi-dimensional if the
         | 
| @@ -368,7 +261,7 @@ class Array | |
| 368 261 | 
             
              # Each subarray becomes one 'line' in the output.
         | 
| 369 262 | 
             
              #
         | 
| 370 263 | 
             
              # @example of a blank array
         | 
| 371 | 
            -
              # | 
| 264 | 
            +
              #
         | 
| 372 265 | 
             
              #   [].to_csv => ""
         | 
| 373 266 |  | 
| 374 267 | 
             
              def to_tsv(ops={})
         | 
| @@ -0,0 +1,114 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            module Enumerable
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              # Map each item => item.id
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              # @return [Enumerable<Object>] an list of each item.id
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @example
         | 
| 9 | 
            +
              #   users = User.find(:all)
         | 
| 10 | 
            +
              #   users.map_id => [1,2,3,4,...]
         | 
| 11 | 
            +
              #
         | 
| 12 | 
            +
              # A typical use is to convert a list of ActiveRecord items to a list of id items.
         | 
| 13 | 
            +
              #
         | 
| 14 | 
            +
              # This method is a faster way to get the same results as items.map(&:id)
         | 
| 15 | 
            +
              #
         | 
| 16 | 
            +
              def map_id
         | 
| 17 | 
            +
                map{|item| item.id}
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              # Map each item => item.to_a
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              # @return [Enumberable<Array<Object>>] a list of each item.to_a
         | 
| 23 | 
            +
              #
         | 
| 24 | 
            +
              # @example
         | 
| 25 | 
            +
              #   hashes = [{1=>2, 3=>4},{5=>6, 7=>8}]
         | 
| 26 | 
            +
              #   hashes.map_to_a => [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
         | 
| 27 | 
            +
              #
         | 
| 28 | 
            +
              # This method is a faster way to get the same results as items.map(&:to_a)
         | 
| 29 | 
            +
              #
         | 
| 30 | 
            +
              def map_to_a
         | 
| 31 | 
            +
                map{|item| item.to_a}
         | 
| 32 | 
            +
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              # Map each item => item.to_f
         | 
| 35 | 
            +
              #
         | 
| 36 | 
            +
              # @return [Enumerable<Float>] a list of each item.to_f
         | 
| 37 | 
            +
              #
         | 
| 38 | 
            +
              # @example
         | 
| 39 | 
            +
              #   strings = ["1","2","3"]
         | 
| 40 | 
            +
              #   strings.map_to_f => [1.0, 2.0, 3.0]
         | 
| 41 | 
            +
              #
         | 
| 42 | 
            +
              # A typical use is to convert a list of String items to a list of float items.
         | 
| 43 | 
            +
              #
         | 
| 44 | 
            +
              # This method is a fast way to get the same results as items.map(&:to_f)
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
              def map_to_f
         | 
| 47 | 
            +
                map{|item| item.to_f}
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
              # Map each item => item.to_i
         | 
| 51 | 
            +
              #
         | 
| 52 | 
            +
              # @return [Enumerable<Integer>] a list of each item.to_i
         | 
| 53 | 
            +
              #
         | 
| 54 | 
            +
              # @example
         | 
| 55 | 
            +
              #   strings = ["1","2","3"]
         | 
| 56 | 
            +
              #   strings.map_to_i => [1, 2, 3]
         | 
| 57 | 
            +
              #
         | 
| 58 | 
            +
              # A typical use is to convert a list of String items to a list of integer items.
         | 
| 59 | 
            +
              #
         | 
| 60 | 
            +
              # This method is a fast way to get the same results as items.map(&:to_i)
         | 
| 61 | 
            +
              #
         | 
| 62 | 
            +
              def map_to_i
         | 
| 63 | 
            +
                map{|item| item.to_i}
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
              # Map each item => item.to_s
         | 
| 67 | 
            +
              #
         | 
| 68 | 
            +
              # @return [Enumerable<String>] a list of each item.to_s
         | 
| 69 | 
            +
              #
         | 
| 70 | 
            +
              # @example
         | 
| 71 | 
            +
              #   numbers = [1, 2, 3]
         | 
| 72 | 
            +
              #   numbers.map_to_s => ["1", "2", "3"]
         | 
| 73 | 
            +
              #
         | 
| 74 | 
            +
              # A typical use is to convert a list of Numeric items to a list of String items.
         | 
| 75 | 
            +
              #
         | 
| 76 | 
            +
              # This method is a fast way to get the same results as items.map(&:to_s)
         | 
| 77 | 
            +
              #
         | 
| 78 | 
            +
              def map_to_s
         | 
| 79 | 
            +
                map{|item| item.to_s}
         | 
| 80 | 
            +
              end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              # Map each item => item.to_sym
         | 
| 83 | 
            +
              #
         | 
| 84 | 
            +
              # @return [Enumerable<Symbol>] a list of each item.to_sym
         | 
| 85 | 
            +
              #
         | 
| 86 | 
            +
              # @example
         | 
| 87 | 
            +
              #   strings = ["foo", "goo", "hoo"]
         | 
| 88 | 
            +
              #   strings.map_to_sym => [:foo, :goo, :hoo]
         | 
| 89 | 
            +
              #
         | 
| 90 | 
            +
              # A typical use is to convert a list of Object items to a list of Symbol items.
         | 
| 91 | 
            +
              #
         | 
| 92 | 
            +
              # This method is a fast way to get the same results as items.map(&:to_sym)
         | 
| 93 | 
            +
              #
         | 
| 94 | 
            +
              def map_to_sym
         | 
| 95 | 
            +
                map{|item| item.to_sym}
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
              # Map each item and its index => a new output
         | 
| 99 | 
            +
              #
         | 
| 100 | 
            +
              # @return [Enumerable<Object>] an list of each item transformed by the block
         | 
| 101 | 
            +
              # @see Enumerable#map
         | 
| 102 | 
            +
              # @see Enumerable#each_with_index
         | 
| 103 | 
            +
              #
         | 
| 104 | 
            +
              # @example
         | 
| 105 | 
            +
              #   strings = ["a", "b", "c"]
         | 
| 106 | 
            +
              #   strings.map_with_index{|string,index| "#{string}#{index}"}
         | 
| 107 | 
            +
              #    => ["a0, "b1", "c3"]
         | 
| 108 | 
            +
              #
         | 
| 109 | 
            +
              def map_with_index
         | 
| 110 | 
            +
                index=-1
         | 
| 111 | 
            +
                map{|item| index+=1; yield(item,index)}
         | 
| 112 | 
            +
              end
         | 
| 113 | 
            +
             | 
| 114 | 
            +
            end
         | 
| @@ -0,0 +1,66 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            module Enumerable
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              # @example
         | 
| 5 | 
            +
              #   enum.nitems?(n) {| obj | block }
         | 
| 6 | 
            +
              #    => true iff the block is not false or nil num times
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @return [Boolean] true iff the block is not false or nil num times
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              def nitems?(n)
         | 
| 11 | 
            +
                num = 0
         | 
| 12 | 
            +
                each{|item|
         | 
| 13 | 
            +
                  if yield(item)
         | 
| 14 | 
            +
                    num+=1
         | 
| 15 | 
            +
                    if num > n then return false end
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                }
         | 
| 18 | 
            +
                return num==n
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              # @example
         | 
| 22 | 
            +
              #   enum.nitems_while {| obj | block }
         | 
| 23 | 
            +
              #    => number of items
         | 
| 24 | 
            +
              #
         | 
| 25 | 
            +
              # @return [Integer] the number of leading elements for which block is not false or nil.
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              def nitems_while
         | 
| 28 | 
            +
                num = 0
         | 
| 29 | 
            +
                each{|item| yield(item) ? (num+=1) : break}
         | 
| 30 | 
            +
                return num
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              # @example
         | 
| 34 | 
            +
              #   enum.nitems_until {| obj | block }
         | 
| 35 | 
            +
              #   => number of items
         | 
| 36 | 
            +
              #
         | 
| 37 | 
            +
              # @return [Integer] the number of leading elements for which block is false.
         | 
| 38 | 
            +
              #
         | 
| 39 | 
            +
              def nitems_until
         | 
| 40 | 
            +
                num = 0
         | 
| 41 | 
            +
                each{|item|
         | 
| 42 | 
            +
                  if yield(item)
         | 
| 43 | 
            +
                    break
         | 
| 44 | 
            +
                  else
         | 
| 45 | 
            +
                    num+=1
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
                }
         | 
| 48 | 
            +
                return num
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
             | 
| 52 | 
            +
              # Calls block with two arguments, the item and its index, for each item in enum.
         | 
| 53 | 
            +
              #
         | 
| 54 | 
            +
              # @example
         | 
| 55 | 
            +
              #   enum.nitems_with_index {|obj,i| block }
         | 
| 56 | 
            +
              #    => number of items
         | 
| 57 | 
            +
              #
         | 
| 58 | 
            +
              # @return [Integer] the number of leading elements for which block is true.
         | 
| 59 | 
            +
              #
         | 
| 60 | 
            +
              def nitems_with_index
         | 
| 61 | 
            +
                index = 0
         | 
| 62 | 
            +
                each{|item| yield(item,index) ? (index+=1) : break}
         | 
| 63 | 
            +
                return index
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            end
         | 
| @@ -0,0 +1,50 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            module Enumerable
         | 
| 3 | 
            +
             | 
| 4 | 
            +
              # @example
         | 
| 5 | 
            +
              #   enum.select_while {|obj| block }
         | 
| 6 | 
            +
              #    => array
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # @return [Array<Object>] the leading elements for which block is not false or nil.
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              def select_while
         | 
| 11 | 
            +
                arr = []
         | 
| 12 | 
            +
                each{|item| yield(item) ? (arr << item) : break}
         | 
| 13 | 
            +
                return arr
         | 
| 14 | 
            +
              end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              # @example
         | 
| 17 | 
            +
              #   enum.select_until {|obj| block }
         | 
| 18 | 
            +
              #    => array
         | 
| 19 | 
            +
              #
         | 
| 20 | 
            +
              # @return [Array<Object>] the leading elements for which block is false or nil.
         | 
| 21 | 
            +
              #
         | 
| 22 | 
            +
              def select_until
         | 
| 23 | 
            +
                arr = []
         | 
| 24 | 
            +
                each{|item| yield(item) ? break : (arr << item)}
         | 
| 25 | 
            +
                return arr
         | 
| 26 | 
            +
              end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              # Calls block with two arguments, the item and its index, for each item in enum.
         | 
| 29 | 
            +
              #
         | 
| 30 | 
            +
              # @example
         | 
| 31 | 
            +
              #   enum.select_with_index {|obj,i| block }
         | 
| 32 | 
            +
              #   => array
         | 
| 33 | 
            +
              #
         | 
| 34 | 
            +
              # @return [Array<Object> the leading elements for which block is not false or nil.
         | 
| 35 | 
            +
              #
         | 
| 36 | 
            +
              def select_with_index
         | 
| 37 | 
            +
                index = 0
         | 
| 38 | 
            +
                arr = []
         | 
| 39 | 
            +
                each{|item|
         | 
| 40 | 
            +
                  if yield(item,index)
         | 
| 41 | 
            +
                    arr << item
         | 
| 42 | 
            +
                    index+=1
         | 
| 43 | 
            +
                  else
         | 
| 44 | 
            +
                    break
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                }
         | 
| 47 | 
            +
                return arr
         | 
| 48 | 
            +
              end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            end
         |