public struct Array2d<T> { public let width: Int public let height: Int private(set) public var data: [T] public init(initial: T, width: Int, height: Int) { precondition(width > 0 && height > 0) self.width = width self.height = height data = Array(repeating: initial, count: width * height) } public subscript(pos: (Int, Int)) -> T { get { let (x, y) = pos precondition(0..<width ~= x) precondition(0..<height ~= y) return data[x + y * width] } set(newValue) { let (x, y) = pos precondition(0..<width ~= x) precondition(0..<height ~= y) data[x + y * width] = newValue } } }