class Array
Public Instance Methods
[](index, length=nil)
click to toggle source
# File lib/array/subindex.rb, line 4 def [](index, length=nil) case index.class.to_s.to_sym when :Range fetch_range(index) when :Float, :Rational fetch_subindex(index) else fetch_integer_index(index, length) end end
Private Instance Methods
array_like?(test)
click to toggle source
# File lib/array/subindex.rb, line 74 def array_like?(test) test.respond_to?(:to_a) end
array_subset(value, subindex, direction)
click to toggle source
# File lib/array/subindex.rb, line 78 def array_subset(value, subindex, direction) value = [*value] # .to_a give deprication warings in 1.8.7 subarray = if value.size <= 1 value else index = (value.length.to_f * subindex).to_i subarray = case direction.to_sym when :to_end value.slice(index, value.size-1) when :from_beginning value.slice(0, index) else raise "unknown direction :#{direction}" end subarray end if subarray.all?{ |a| numeric?(a) } subarray.inject(:+) else subarray.join end end
fetch_integer_index(index,length)
click to toggle source
# File lib/array/subindex.rb, line 41 def fetch_integer_index(index,length) if length fetch_slice(index, length.to_i) else self.at(index) end end
fetch_range(range)
click to toggle source
# File lib/array/subindex.rb, line 49 def fetch_range(range) self.slice(range.first, range.to_a.length) end
fetch_slice(index, length)
click to toggle source
# File lib/array/subindex.rb, line 37 def fetch_slice(index, length) self.slice(index, length.to_i) end
fetch_subindex(index)
click to toggle source
# File lib/array/subindex.rb, line 17 def fetch_subindex(index) subindex = index.to_f - index.to_i f = index.to_f.floor c = index.to_f.ceil f_value = self.at(f) c_value = self.at(c) f_value = array_subset(f_value, subindex, :to_end) if array_like?(f_value) c_value = array_subset(c_value, subindex, :from_beginning) if array_like?(c_value) if (numeric?(f_value) && numeric?(c_value)) subindex_as_number(subindex, f_value, c_value) else subindex_as_string(subindex, f_value, c_value) end end
numeric?(test)
click to toggle source
# File lib/array/subindex.rb, line 70 def numeric?(test) (test.class != String) && (!!(test.to_s =~ /[\d\.\/]+/)) end
subindex_as_number(subindex, f_value, c_value)
click to toggle source
# File lib/array/subindex.rb, line 53 def subindex_as_number(subindex, f_value, c_value) f_fractional = f_value.to_f * (1.0 - subindex) c_fractional = c_value.to_f * subindex f_fractional + c_fractional end
subindex_as_string(subindex, f_value, c_value)
click to toggle source
# File lib/array/subindex.rb, line 59 def subindex_as_string(subindex, f_value, c_value) f_value = f_value.to_s c_value = c_value.to_s f_index = (f_value.length * subindex).to_i c_index = (c_value.length * subindex).to_i [ f_value.slice(f_index, f_value.length), c_value.slice(0, c_index) ].join end