module Commons where import GHC.IO.Handle (isEOF) import Data.Array (Array, listArray, (!), Ix (inRange), bounds) data Direction = North | South | West | East deriving (Eq, Ord, Show) data Tile = Empty | Rock | Slope { direction :: Direction } deriving (Eq, Show) type Trails = Array (Int, Int) Tile parseLine :: String -> [Tile] parseLine = map (\case '.' -> Empty '#' -> Rock '>' -> Slope {direction = East} 'v' -> Slope {direction = South} '<' -> Slope {direction = West} '^' -> Slope {direction = North}) parseTrails :: IO [[Tile]] parseTrails = do done <- isEOF if done then return [] else do line <- getLine let trailsLine = parseLine line trails <- parseTrails return (trailsLine: trails) parse :: IO Trails parse = do trails <- parseTrails return $ listArray ((1, 1), (length trails, length $ head trails)) $ concat trails