1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#!/usr/bin/ruby 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# encoding: utf-8 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass String 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def /( subpath ) 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File.join( self, subpath.to_s ) 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def here_indent( chr = '| ' ) 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dup.here_indent!( chr ) 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def here_indent!( chr = '| ' ) 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver chr = Regexp.escape( chr ) 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exp = Regexp.new( "^ *#{ chr }" ) 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.gsub!( exp,'' ) 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def here_flow( chr = '| ' ) 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver dup.here_flow!( chr ) 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def here_flow!( chr = '| ' ) 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver here_indent!( chr ).gsub!( /\n\s+/,' ' ) 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( self ) 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Indent left or right by n spaces. 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # (This used to be called #tab and aliased as #indent.) 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Gavin Sinclair 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Trans 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def indent( n ) 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if n >= 0 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /^/, ' ' * n ) 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /^ {0,#{ -n }}/, "" ) 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Outdent just indents a negative number of spaces. 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Noah Gibbs 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def outdent( n ) 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver indent( -n ) 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Returns the shortest length of leading whitespace for all non-blank lines 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # n = %Q( 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # a = 3 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # b = 4 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # ).level_of_indent #=> 2 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Kyle Yetter 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def level_of_indent 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.scan( /^ *(?=\S)/ ).map { |space| space.length }.min || 0 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def fixed_indent( n ) 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self.outdent( self.level_of_indent ).indent( n ) 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Provides a margin controlled string. 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # x = %Q{ 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # | This 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # | is 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # | margin controlled! 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # }.margin 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # NOTE: This may still need a bit of tweaking. 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Trans 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def margin( n=0 ) 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #d = /\A.*\n\s*(.)/.match( self )[1] 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver #d = /\A\s*(.)/.match( self)[1] unless d 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver d = ( ( /\A.*\n\s*(.)/.match( self ) ) || 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ( /\A\s*(.)/.match( self ) ) )[ 1 ] 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return '' unless d 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if n == 0 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /\n\s*\Z/,'' ).gsub( /^\s*[#{ d }]/, '' ) 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /\n\s*\Z/,'' ).gsub( /^\s*[#{ d }]/, ' ' * n ) 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Expands tabs to +n+ spaces. Non-destructive. If +n+ is 0, then tabs are 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # simply removed. Raises an exception if +n+ is negative. 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Thanks to GGaramuno for a more efficient algorithm. Very nice. 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Gavin Sinclair 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Noah Gibbs 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: GGaramuno 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def expand_tabs( n=8 ) 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = n.to_int 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver raise ArgumentError, "n must be >= 0" if n < 0 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return gsub( /\t/, "" ) if n == 0 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return gsub( /\t/, " " ) if n == 1 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str = self.dup 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str.gsub!( /^([^\t\n]*)(\t+)/ ) { |f| 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver val = ( n * $2.size - ( $1.size % n ) ) 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $1 << ( ' ' * val ) 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver str 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # The reverse of +camelcase+. Makes an underscored of a camelcase string. 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Changes '::' to '/' to convert namespaces to paths. 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Examples 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # "SnakeCase".snakecase #=> "snake_case" 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # "Snake-Case".snakecase #=> "snake_case" 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # "SnakeCase::Errors".underscore #=> "snake_case/errors" 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def snakecase 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /::/, '/' ). # NOT SO SURE ABOUT THIS -T 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /([A-Z]+)([A-Z][a-z])/,'\1_\2' ). 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver gsub( /([a-z\d])([A-Z])/,'\1_\2' ). 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tr( "-", "_" ). 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver downcase 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Module 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Returns the module's container module. 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # module Example 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # class Demo 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # end 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # end 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Example::Demo.modspace #=> Example 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # See also Module#basename. 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Trans 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def modspace 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver space = name[ 0...( name.rindex( '::' ) || 0 ) ] 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver space.empty? ? Object : eval( space ) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermodule Kernel 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver autoload :Tempfile, 'tempfile' 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def screen_width( out=STDERR ) 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default_width = ENV[ 'COLUMNS' ] || 80 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tiocgwinsz = 0x5413 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver data = [ 0, 0, 0, 0 ].pack( "SSSS" ) 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if out.ioctl( tiocgwinsz, data ) >= 0 then 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rows, cols, xpixels, ypixels = data.unpack( "SSSS" ) 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if cols >= 0 then cols else default_width end 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default_width 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rescue Exception => e 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default_width rescue ( raise e ) 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass File 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # given some target path string, and an optional reference path 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # (Dir.pwd by default), this method returns a string containing 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # the relative path of the target path from the reference path 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Examples: 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # File.relative_path('rel/path') # => './rel/path' 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # File.relative_path('/some/abs/path', '/some') # => './abs/path' 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # File.relative_path('/some/file.txt', '/some/abs/path') # => '../../file.txt' 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def self.relative_path( target, reference = Dir.pwd ) 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pair = [ target, reference ].map! do |path| 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File.expand_path( path.to_s ).split( File::Separator ).tap do |list| 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if list.empty? then list << String.new( File::Separator ) 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver elsif list.first.empty? then list.first.replace( File::Separator ) 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver target_list, reference_list = pair 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while target_list.first == reference_list.first 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver target_list.shift 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver reference_list.shift or break 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver relative_list = Array.new( reference_list.length, '..' ) 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver relative_list.empty? and relative_list << '.' 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver relative_list.concat( target_list ).compact! 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return relative_list.join( File::Separator ) 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Dir 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver defined?( DOTS ) or DOTS = %w(. ..).freeze 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def self.children( directory ) 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver entries = Dir.entries( directory ) - DOTS 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver entries.map! do |entry| 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver File.join( directory, entry ) 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def self.mkpath( path ) 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $VERBOSE and $stderr.puts( "INFO: Dir.mkpath(%p)" % path ) 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver test( ?d, path ) and return( path ) 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent = File.dirname( path ) 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver test( ?d, parent ) or mkpath( parent ) 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Dir.mkdir( path ) 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return( path ) 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverclass Array 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Pad an array with a given <tt>value</tt> upto a given <tt>length</tt>. 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # [0,1,2].pad(6,"a") #=> [0,1,2,"a","a","a"] 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # If <tt>length</tt> is a negative number padding will be added 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # to the beginning of the array. 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # [0,1,2].pad(-6,"a") #=> ["a","a","a",0,1,2] 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Richard Laugesen 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def pad( len, val=nil ) 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return dup if self.size >= len.abs 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if len < 0 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Array.new( ( len+size ).abs,val ) + self 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver self + Array.new( len-size,val ) 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # Like #pad but changes the array in place. 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # a = [0,1,2] 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # a.pad!(6,"x") 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # a #=> [0,1,2,"x","x","x"] 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # CREDIT: Richard Laugesen 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver def pad!( len, val=nil ) 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return self if self.size >= len.abs 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if len < 0 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replace Array.new( ( len+size ).abs,val ) + self 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver concat Array.new( len-size,val ) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver end 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverend 270