module Datatypes.Cell (Cell(..), rotateClockwise, rotateCounterclockwise ) where type Cell = (Int, Int) rotateClockwise :: Cell -> Cell -> Cell rotateClockwise pivot cell = let cubeCell = toCube cell cubePivot = toCube pivot cubeZero = cubeCell `cubeDiff` cubePivot rotatedZero = rotateCubeClockwise cubeZero rotatedCube = rotatedZero `cubeSum` cubePivot resultCell = fromCube rotatedCube in resultCell rotateCounterclockwise :: Cell -> Cell -> Cell rotateCounterclockwise pivot cell = let cubeCell = toCube cell cubePivot = toCube pivot cubeZero = cubeCell `cubeDiff` cubePivot rotatedZero = rotateCubeCounterclockwise cubeZero rotatedCube = rotatedZero `cubeSum` cubePivot resultCell = fromCube rotatedCube in resultCell -- PRIVATE type CubeCell = (Int, Int, Int) toCube :: Cell -> CubeCell toCube (x, y) = (xx, yy, zz) where xx = x - (y - (y `mod` 2)) `div` 2 zz = y yy = -(xx + zz) rotateCubeClockwise :: CubeCell -> CubeCell rotateCubeClockwise (xx, yy, zz) = (-zz, -xx, -yy) rotateCubeCounterclockwise :: CubeCell -> CubeCell rotateCubeCounterclockwise (xx, yy, zz) = (-yy, -zz, -xx) fromCube :: CubeCell -> Cell fromCube (xx, yy, zz) = (x, y) where x = xx + (zz - (zz `mod` 2)) `div` 2 y = zz cubeDiff :: CubeCell -> CubeCell -> CubeCell cubeDiff (x1, y1, z1) (x2, y2, z2) = (x1 - x2, y1 - y2, z1 - z2) cubeSum :: CubeCell -> CubeCell -> CubeCell cubeSum (x1, y1, z1) (x2, y2, z2) = (x1 + x2, y1 + y2, z1 + z2)