Sha256: 489a2ae09649b08c247f7a3f8ca0a713c4fa661a2fd549ceed96599d037c0c61

Contents?: true

Size: 1.59 KB

Versions: 396

Compression:

Stored size: 1.59 KB

Contents

module Robot (Bearing(..),
              mkRobot,
              coordinates,
              bearing,
              simulate,
              turnRight,
              turnLeft
              ) where
import Data.List (foldl')
import Control.Arrow (first, second)

data Movement = TurnLeft
              | TurnRight
              | Advance
              deriving (Show, Eq, Enum)

data Bearing = North
               | East
               | South
               | West
               deriving (Show, Eq, Enum, Bounded)

type Coordinates = (Int, Int)

data Robot = Robot { bearing :: Bearing
                   , coordinates :: Coordinates
                   } deriving (Show, Eq)
mkRobot :: Bearing -> Coordinates -> Robot
mkRobot = Robot

advance :: Bearing -> Coordinates -> Coordinates
advance dir = case dir of
  North -> second succ
  East  -> first succ
  South -> second pred
  West  -> first pred

turnLeft, turnRight :: Bearing -> Bearing
turnLeft d | d == minBound = maxBound
           | otherwise     = pred d

turnRight d | d == maxBound = minBound
            | otherwise     = succ d

instructions :: String -> [Movement]
instructions = map fromChar
  where fromChar c = case c of
          'L' -> TurnLeft
          'R' -> TurnRight
          'A' -> Advance
          _   -> error ("Unknown movement " ++ show c)

step :: Movement -> Robot -> Robot
step Advance   r = r { coordinates = advance (bearing r) (coordinates r) }
step TurnLeft  r = r { bearing = turnLeft (bearing r) }
step TurnRight r = r { bearing = turnRight (bearing r) }

simulate :: Robot -> String -> Robot
simulate r = foldl' (flip step) r . instructions

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.78 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.77 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.76 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.75 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.74 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.73 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.72 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.71 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.70 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.69 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.68 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.67 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.66 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.65 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.64 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.63 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.62 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.61 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.60 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs
trackler-2.2.1.59 tracks/haskell/exercises/robot-simulator/examples/success-standard/src/Robot.hs