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); int toIndex(int x, int y) => y * width + x; Point toCoords(int index) => Point(index % width, index ~/ width); }