module Wordify.Rules.Pos (Pos,
posAt,
above,
below,
left,
right,
xPos,
yPos,
gridValue,
starPos,
posMin,
posMax) where
import qualified Data.Map as Map
import Wordify.Rules.Pos.Internal
import Data.Maybe
posMin :: Int
posMin = 1
posMax :: Int
posMax = 15
posAt :: (Int, Int) -> Maybe Pos
posAt = flip Map.lookup posMap
-- | The position above the given position, if it exists.
above :: Pos -> Maybe Pos
above (Pos x y _) = posAt (x,y + 1)
-- | The position below the given position, if it exists.
below :: Pos -> Maybe Pos
below (Pos x y _) = posAt (x, y - 1 )
-- | The position to the left of the given position, if it exists.
left :: Pos -> Maybe Pos
left (Pos x y _) = posAt (x - 1, y)
-- | The position to the right of the given position, if it exists.
right :: Pos -> Maybe Pos
right (Pos x y _) = posAt (x + 1, y)
-- | The position of the star square
starPos :: Pos
starPos = Pos 8 8 "H8"
{- A map keyed by tuples representing (x,y) co-ordinates, and valued by their
corresponding Pos types -}
posMap :: Map.Map (Int, Int) Pos
posMap = Map.fromList $ catMaybes coordTuples
where
coordTuples = zipWith makeTuple (sequence [[posMin..posMax], [posMin..posMax]]) $ cycle ['A'..'O']
makeTuple (x:y:_) gridLetter = Just $ ((y,x) , Pos y x (gridLetter : show x) )
makeTuple _ _ = Nothing
xPos :: Pos -> Int
xPos (Pos x _ _) = x
yPos :: Pos -> Int
yPos (Pos _ y _) = y
gridValue :: Pos -> String
gridValue (Pos _ _ grid) = grid