import 'dart:core'; import 'dart:math'; import 'package:collection/collection.dart'; class Grid extends DelegatingList { final List _internal; final width; final height; Grid(int width, int height) : this._(List(width * height), width, height); Grid.from(Grid l) : this._(List.from(l.getRange(0, l.length)), l.width, l.height); Grid.fromList(List l, int width) : this._(l, width, l.length ~/ width); Grid._(l, int w, int h) : _internal = l, width = w, height = h, super(l); E elementAtPos(int x, int y) { int i = toIndex(x, y); if (i >= length) throw RangeError.index(i, this); _internal[i]; } void setElement(int x, int y, E value) { int i = toIndex(x, y); if (i >= length) throw RangeError.index(i, this); _internal[i] = value; } E get(int x, int y) => elementAtPos(x, y); void set(int x, int y, E value) => setElement(x, y, value); /// Calculate list index from coordinates. /// /// Can be used to get the correct index from coordinates passed in. /// Will only calculate the index, not take into consideration any grid size /// constraints etc; use [get] for that (generally recommended). int toIndex(int x, int y) => (x < 0 || y < 0) ? throw RangeError("Coordinates for Grid Indexing must not be negative.") : y * width + x; Point toCoords(int index) => Point(index % width, index ~/ width); }