package be.vandewalleh.aoc.days.geometry import java.util.* private fun ArrayList.reversed(): ArrayList { val out = ArrayList(this.size) asReversed().forEach { out.add(it) } return out } fun Grid.flipVertically(): Grid = Grid(data.reversed()) fun Grid.flipHorizontally(): Grid { val out = ArrayList>(height) for (y in 0 until height) { out.add(data[y].reversed()) } return Grid(out) } fun Grid.rotateRight(): Grid { val out = ArrayList>(width) for (x in 0 until width) { out.add(ArrayList(height)) for (y in 0 until height) { out[x].add(data[y][x]) } } return Grid(out).flipHorizontally() } fun Grid.rotateLeft(): Grid { val data = flipHorizontally().data val out = ArrayList>(width) for (x in 0 until width) { out.add(ArrayList(height)) for (y in 0 until height) { out[x].add(data[y][x]) } } return Grid(out).flipHorizontally() } fun Grid.transformations(): Sequence> = sequence { yield(this@transformations) yield(flipHorizontally()) yield(flipVertically()) yield(rotateLeft()) yield(rotateRight()) yield(flipHorizontally().flipVertically()) yield(flipVertically().rotateRight()) yield(flipVertically().rotateLeft()) }