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