Trying to solve Myntra's Challenge question to learn Haskell
-- Using http://www.learnyouahaskell.com/ as reference
data Coordinate = Coordinate Int Int deriving(Show, Eq)
data Direction = North | West | South | East deriving(Show, Eq)
data Position = Position Coordinate Direction deriving(Show, Eq)
instance Enum Direction where
toEnum 0 = North
toEnum 1 = East
toEnum 2 = South
toEnum 3 = West
toEnum x = toEnum (x `mod` 4)
fromEnum North = 0
fromEnum East = 1
fromEnum South = 2
fromEnum West = 3
turn (Position coordinate direction) findAdjacentDirection = Position coordinate newDirection
where newDirection = findAdjacentDirection direction
turnLeft position = turn position pred
turnRight position = turn position succ
moveForward (Position coordinate direction) = Position newCoordinate direction
where moveCoordinateInDirection (Coordinate x y) North = Coordinate x (y + 1)
moveCoordinateInDirection (Coordinate x y) South = Coordinate x (y - 1)
moveCoordinateInDirection (Coordinate x y) East = Coordinate (x + 1) y
moveCoordinateInDirection (Coordinate x y) West = Coordinate (x - 1) y
newCoordinate = moveCoordinateInDirection coordinate direction
startingDirection = North
startingCoordinate = Coordinate 0 0
inInitialDirection (Position _ direction) = direction == startingDirection
atStartingCoordinate (Position coordinate _) = coordinate == startingCoordinate
inFiniteCircle instructions = inFiniteCircle' instructions startingPosition
where startingPosition = Position startingCoordinate startingDirection
inFiniteCircle' instructions position
| atStartingCoordinate newPosition = True
| not (inInitialDirection newPosition) = inFiniteCircle' instructions newPosition
| otherwise = False
where newPosition = consumeInstructions instructions position
consumeInstructions "" position = position
consumeInstructions (i:is) position = consumeInstructions is newPosition
where newPosition = consumeInstruction i position
consumeInstruction 'L' position = turnLeft position
consumeInstruction 'R' position = turnRight position
consumeInstruction 'G' position = moveForward position
-- ~/tmp% ghci
-- GHCi, version 7.10.1: http://www.haskell.org/ghc/ :? for help
-- Prelude> :load myntra-challenge
-- [1 of 1] Compiling Main ( myntra-challenge.hs, interpreted )
-- Ok, modules loaded: Main.
-- *Main> inFiniteCircle "L"
-- True
-- *Main> inFiniteCircle "GRGL"
-- False
-- *Main> inFiniteCircle "GRGR"
-- True