{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module Types where
import Control.Monad.State.Strict
import Data.Array
import Lens.Simple
import UI.NCurses
-- | Main monad
type Game a = StateT GameState Curses a
-- | Global state
data GameState = GameState
{ _gPlayer :: Player
, _gBoardState :: BoardState (BoardState (Maybe Player))
, _gMode :: Mode
, _gQuit :: Bool
} deriving Show
data Mode = Free | Fixed deriving Show
-- | State for a 3x3 board with an inner type for each cell
data BoardState t = BoardState
{ _bsCells :: Array Position t
, _bsPosition :: Position
, _bsWinner :: Maybe Winner
} deriving Show
-- | Player and Winners
data Player = X
| O
deriving (Show, Eq, Ord)
data Winner = Player Player
| Draw
deriving (Show, Eq, Ord)
-- | Movement and Input simplified from NCurses
data Movement = KUp | KRight | KDown | KLeft
deriving Show
data Input = Movement Movement
| Select | Quit
deriving Show
-- | Position types
data Position = Position Vertical Horizontal
deriving (Show, Eq, Ord, Ix)
data Vertical = T | M | B deriving (Show, Enum, Eq, Ord, Ix)
data Horizontal = L | C | R deriving (Show, Enum, Eq, Ord, Ix)
-- | Color abstraction
type Colors = GameColor -> ColorID
data GameColor = Red | Blue | Yellow | Green
class Colorable a where
color :: a -> GameColor
instance Colorable Player where
color X = Red
color O = Blue
instance Colorable Winner where
color (Player pl) = color pl
color Draw = Yellow
instance Colorable Mode where
color Fixed = Yellow
color Free = Green
$(makeLenses ''GameState)
$(makeLenses ''BoardState)