{-# LANGUAGE DeriveGeneric #-} module Battlesnake.Core.Coordinate where import Data.Aeson ( FromJSON (parseJSON) , KeyValue ((.=)) , ToJSON (toEncoding) , pairs , withObject , (.:) ) import GHC.Generics -- | Represents a coordinate on the game board. data Coordinate = Coordinate { coordX :: Integer -- ^ The X coordinate (0 indexed, from left to right) , coordY :: Integer -- ^ The Y coordinate (0 indexed, from bottom to top) } deriving (Show, Eq, Generic) instance ToJSON Coordinate where toEncoding (Coordinate x y) = pairs ("x" .= x <> "y" .= y) instance FromJSON Coordinate where parseJSON = withObject "Coordinate" $ \v -> Coordinate <$> v .: "x" <*> v .: "y"