Sha256: 1c2ab4d62e909f4c070bc889b40b198bee40506eb775c7931b7d1a0767cceee1

Contents?: true

Size: 1.42 KB

Versions: 3

Compression:

Stored size: 1.42 KB

Contents

module Basic101

  class BasicArray

    def initialize(num_dimensions, default)
      @default = default
      dimension [10] * num_dimensions
    end

    def dimension(max_indices)
      check_max_indices(max_indices)
      @max_indices = max_indices
      @array = make_array(max_indices)
    end

    def get(indices)
      check_indices(indices)
      array_get(@array, indices)
    end

    def set(indices, value)
      check_indices(indices)
      array_set(@array, value, indices)
    end

    private

    def make_array(max_indices)
      if max_indices.size == 0
        @default
      else
        Array.new(max_indices.first + 1) do
          make_array(max_indices[1..-1])
        end
      end
    end

    def array_get(a, indices)
      if indices.size == 0
        a
      else
        array_get(a[indices.first.to_i], indices[1..-1])
      end
    end

    def array_set(a, value, indices)
      if indices.size == 1
        a[indices.first] = value
      else
        array_set(a[indices.first], value, indices[1..-1])
      end
    end

    def check_max_indices(max_indices)
      max_indices.each do |max_index|
        raise ArraySizeError if max_index < 0
      end
    end

    def check_indices(indices)
      raise IndexError unless indices.size == @max_indices.size
      indices.zip(@max_indices).each do |index, dimension|
        raise IndexError unless (0..dimension).include?(index)
      end
    end

  end

end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
basic101-0.4.0 lib/basic101/basic_array.rb
basic101-0.2.0 lib/basic101/basic_array.rb
basic101-0.1.0 lib/basic101/basic_array.rb