module Types where
import Control.Monad.State
import qualified Data.Map as Map
import qualified Data.Set as S
type EnglishWord = String
type Letter = Char
type SecretWord = EnglishWord
type GuessedSoFar = [Letter]
type GuessedLetters = S.Set Letter
type GuessedWords = S.Set EnglishWord
type MapPerLength = Map.Map Int [EnglishWord]
type WordDataSet = ([EnglishWord], MapPerLength)
type MapPerAlphabet = Map.Map Char [EnglishWord]
data GameStatus = GAME_WON | GAME_LOST | KEEP_GUESSING
deriving (Show, Eq)
-- | FIXME: secretWord and maxWrongGuesses are inmutable thus separate them out.??
data Hangman = Hangman { secretWord :: SecretWord
, maxWrongGuesses :: Int
, guessedSoFar :: GuessedSoFar
, incorrectGuessedLetters :: GuessedLetters
, correctGuessedLetters :: GuessedLetters
, incorrectGuessedWords :: GuessedWords
}
deriving (Show)
-- | anything that be able to make guess (i.e. instances of GuessAction)
data NextGuess = forall a. GuessAction a => NextGuess {getGuess :: a}
type HangmanGame = StateT Hangman IO
-- | Game Strategy. A parametric state `s`; computation result is `NextGuess`
type StrategyState s = StateT s IO NextGuess
-- | make guess thus Hangman would be updated.
class GuessAction g where
makeGuess :: g -> Hangman -> Hangman
-- | Generate next guess `NextGuess` as well as update the guess strategy
class GameStategy s where
nextGuess :: Hangman -> StrategyState s
{-
class HangmanC a where {}
instance HangmanC Hangman
-}