Make grid mutable.

This commit is contained in:
Sven Weidauer 2024-12-15 11:22:43 +01:00
parent 03ddb2a0e6
commit 3351c1f4a7
2 changed files with 20 additions and 5 deletions

View file

@ -1,7 +1,11 @@
class CharGrid(val rows: List<String>) : Grid<Char> { class CharGrid(rows: List<String>) : Grid<Char> {
val rows = rows.toMutableList()
override val width = rows.firstOrNull()?.count() ?: 0 override val width = rows.firstOrNull()?.count() ?: 0
override val height get() = rows.count() override val height get() = rows.count()
constructor(width: Int, height: Int, char: Char)
: this((1..height).map { char.toString().repeat(width) })
init { init {
assert(rows.all { it.length == width }) assert(rows.all { it.length == width })
} }
@ -75,4 +79,8 @@ class CharGrid(val rows: List<String>) : Grid<Char> {
val data = rows.flatMap { it.map(fn) } val data = rows.flatMap { it.map(fn) }
return ListGrid(width, height, data) return ListGrid(width, height, data)
} }
override fun set(x: Int, y: Int, value: Char) {
rows[y] = rows[y].replaceRange(x, x + 1, value.toString())
}
} }

View file

@ -4,22 +4,29 @@ interface Grid<T> {
fun <U> map(fn: (T) -> U): Grid<U> fun <U> map(fn: (T) -> U): Grid<U>
fun get(x: Int, y: Int): T operator fun get(x: Int, y: Int): T
operator fun set(x: Int, y: Int, value: T)
data class Coordinate(val x: Int, val y: Int) data class Coordinate(val x: Int, val y: Int)
fun inside(coordinate: Coordinate) = coordinate.x in 0..<width && coordinate.y in 0..<height fun inside(coordinate: Coordinate) = coordinate.x in 0..<width && coordinate.y in 0..<height
} }
operator fun <T> Grid<T>.set(coordinate: Grid.Coordinate, value: T) = set(coordinate.x, coordinate.y, value)
operator fun <T> Grid<T>.get(coordinate: Grid.Coordinate) = get(coordinate.x, coordinate.y) operator fun <T> Grid<T>.get(coordinate: Grid.Coordinate) = get(coordinate.x, coordinate.y)
operator fun <T> Grid<T>.contains(coordinate: Grid.Coordinate) = inside(coordinate) operator fun <T> Grid<T>.contains(coordinate: Grid.Coordinate) = inside(coordinate)
class ListGrid<T>(override val width: Int, override val height: Int, private val content: List<T>) : Grid<T> { class ListGrid<T>(override val width: Int, override val height: Int, content: List<T>) : Grid<T> {
init { init {
assert(width * height == content.count()) assert(width * height == content.count())
} }
override fun get(x: Int, y: Int): T = content[x + y * width] private val content = content.toMutableList()
override fun <U> map(fn: (T) -> U): Grid<U> = ListGrid(width, height, content.map(fn)) override fun get(x: Int, y: Int): T = content[x + y * width]
override fun set(x: Int, y: Int, value: T) {
content[x + y * width] = value
}
override fun <U> map(fn: (T) -> U): Grid<U> = ListGrid(width, height, content.map(fn).toMutableList())
} }