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