class GridStruct

Constants

VERSION

Attributes

columns[R]
rows[R]
store[R]

Public Class Methods

new(rows, columns, store = []) click to toggle source
# File lib/grid_struct.rb, line 10
def initialize(rows, columns, store = [])
  @rows = rows
  @columns = columns
  @store = store || []
end

Public Instance Methods

==(other) click to toggle source
# File lib/grid_struct.rb, line 111
def ==(other)
  @store == other.instance_variable_get(:@store)
end
column(n) click to toggle source
# File lib/grid_struct.rb, line 84
def column(n)
  GridStruct::Selector.new(self,*@rows.times.map do |row|
    get_index(row,n)
  end)
end
diagonals(row,column) click to toggle source
# File lib/grid_struct.rb, line 90
def diagonals(row,column)
  selectors = []

  first = diagonal_builder({row: row, column: column})
  second = diagonal_builder({row: row, column: column}, 1, -1)

  selectors.push(GridStruct::Selector.new(self, *first)) if first.size > 1
  selectors.push(GridStruct::Selector.new(self, *second)) if second.size > 1

  return selectors
end
each() { |value,row_column,row_column| ... } click to toggle source
# File lib/grid_struct.rb, line 38
def each
  @store.fill(nil,@store.size...size).each.with_index do |value, index|
    row_column = get_row_column_at(index)
    yield(value,row_column[:row],row_column[:column])
  end
end
each_slice(rows,columns) { |slice(index, rows: rows, columns: columns), index| ... } click to toggle source
# File lib/grid_struct.rb, line 45
def each_slice(rows,columns)
  sub_rows = (@rows / rows.to_f).ceil
  sub_columns = (@columns / columns.to_f).ceil

  sub_rows.times.each do |sub_row|
    sub_columns.ceil.times.each do |sub_column|

      index = sub_column + (sub_row * sub_columns)
      yield(slice(index, rows: rows, columns: columns), index)

    end
  end
end
get(row,column) click to toggle source
# File lib/grid_struct.rb, line 59
def get(row,column)
  @store[get_index(row,column)]
end
map!() { |value, row_column, row_column| ... } click to toggle source
# File lib/grid_struct.rb, line 20
def map!
  size.times.map do |index|
    value = @store[index]
    row_column = get_row_column_at(index)
    @store[index] = yield(value, row_column[:row], row_column[:column])
  end
  return self
end
map_column!(n, &block) click to toggle source
# File lib/grid_struct.rb, line 33
def map_column!(n, &block)
  return map_line!(n, @rows, false, &block)
end
map_row!(n, &block) click to toggle source
# File lib/grid_struct.rb, line 29
def map_row!(n, &block)
  return map_line!(n, @columns, true, &block)
end
row(n) click to toggle source
# File lib/grid_struct.rb, line 78
def row(n)
  start_index = (n * @columns)
  end_index = start_index + @columns
  GridStruct::Selector.new(self,*(start_index...end_index))
end
set(row,column) { || ... } click to toggle source
# File lib/grid_struct.rb, line 16
def set(row,column)
  @store[get_index(row,column)] = yield
end
size() click to toggle source
# File lib/grid_struct.rb, line 102
def size
  @rows * @columns
end
slice(index,dimensions) click to toggle source

TODO Improve

# File lib/grid_struct.rb, line 65
def slice(index,dimensions)
  rows = dimensions[:rows]
  columns = dimensions[:columns]
  sub_columns = (@columns / columns.to_f).ceil

  sub_row = index / sub_columns
  sub_column = index - (sub_row * sub_columns)

  indexes = retrieve_sliced_indexes(rows,columns,sub_row,sub_column)

  return GridStruct::Selector.new(self, *indexes).dimensions(rows,columns)
end
to_a() click to toggle source
# File lib/grid_struct.rb, line 106
def to_a
  store_size = @store.size
  return @store.dup.fill(nil,store_size...size)
end
within_bounds?(row,column) click to toggle source
# File lib/grid_struct.rb, line 115
def within_bounds?(row,column)
  row_within_bounds?(row) && column_within_bounds?(column)
end

Protected Instance Methods

column_within_bounds?(column) click to toggle source
# File lib/grid_struct.rb, line 155
def column_within_bounds?(column)
  line_within_bounds?(column, @columns)
end
diagonal_builder(coordinates, row_direction = 1, column_direction = 1, diagonal_indexes = [], action = :push) click to toggle source
# File lib/grid_struct.rb, line 169
def diagonal_builder(coordinates, row_direction = 1, column_direction = 1, diagonal_indexes = [], action = :push)
  row = coordinates[:row]
  column = coordinates[:column]
  index = get_index(row,column)

  if !diagonal_indexes.include?(index) && within_bounds?(row, column)
    diagonal_indexes.method(action).call(get_index(row,column))

    fetch_diagonal_index(row, column, row_direction, column_direction, diagonal_indexes, -1)
    fetch_diagonal_index(row, column, row_direction, column_direction, diagonal_indexes, 1)
  end

  return diagonal_indexes
end
fetch_diagonal_index(row, column, row_direction, column_direction, diagonal_indexes, sign) click to toggle source
# File lib/grid_struct.rb, line 184
def fetch_diagonal_index(row, column, row_direction, column_direction, diagonal_indexes, sign)
  row = row + sign * row_direction
  column = column + sign * column_direction
  action = sign > 0 ? :push : :unshift

  diagonal_builder({ row: row,
                     column: column },
                   row_direction,
                   column_direction,
                   diagonal_indexes,
                   action)
end
fit_selection_within_same_row(start_index, end_index) click to toggle source
# File lib/grid_struct.rb, line 121
def fit_selection_within_same_row(start_index, end_index)
  start_row = get_row_column_at(start_index)[:row]
  end_row = get_row_column_at(end_index)[:row]

  if start_row != end_row
    extras = [0,(end_index - @columns)].max % @columns
    end_index -= extras
  end

  return start_index...end_index
end
get_index(row,column) click to toggle source
# File lib/grid_struct.rb, line 159
def get_index(row,column)
  (row * @columns) + column
end
get_row_column_at(index) click to toggle source
# File lib/grid_struct.rb, line 163
def get_row_column_at(index)
  row = index / @columns
  column = index - (row * @columns)
  return { row: row, column: column }
end
line_within_bounds?(n, axis_size) click to toggle source
# File lib/grid_struct.rb, line 147
def line_within_bounds?(n, axis_size)
  n >= 0 && n < axis_size
end
map_line!(n, other_axis_size, is_row) { |value,other_axis| ... } click to toggle source
# File lib/grid_struct.rb, line 197
def map_line!(n, other_axis_size, is_row)
  other_axis_size.times.each do |other_axis|
    index = is_row ? get_index(n,other_axis) : get_index(other_axis,n)
    value = @store[index]
    @store[index] = yield(value,other_axis)
  end
  return self
end
retrieve_sliced_indexes(rows, columns, sub_row, sub_column) click to toggle source
# File lib/grid_struct.rb, line 133
def retrieve_sliced_indexes(rows, columns, sub_row, sub_column)
  rows.times.inject([]) do |memo, r|
    start_index = (r * @columns) +
      (sub_row * rows * @columns) +
      (sub_column * columns)
    end_index = start_index + columns

    final_row_indexes = fit_selection_within_same_row(start_index, end_index).to_a
    final_row_indexes.fill(nil,final_row_indexes.size...columns)

    memo += final_row_indexes
  end
end
row_within_bounds?(row) click to toggle source
# File lib/grid_struct.rb, line 151
def row_within_bounds?(row)
  line_within_bounds?(row, @rows)
end