{-# OPTIONS_HADDOCK ignore-exports #-}

module Game (
  Player(Adam,Eve), 
  Game(initial,player,moves),
  flipPlayer,
  solve,
  play,
  Moves,
  Solution
  )
where

-- | Le type des données des joueur
data Player = Adam | Eve 
              deriving (Eq,Ord,Show)

-- | Le type des données des coups
type Moves a = [a]

-- | un jeu est identifié à l'enesmble de ses positions (le type a)
-- avec les methodes de la classe Game 
class Game a where 
    -- | la position intiale du jeu a
    initial :: a
    -- | le joueur qui doit choisir un coup, dans une position donnée
    player :: a -> Player
    -- | les coups possibles, à partir d'une position donnée
    moves :: a -> Moves a


-- | l'autre joueur 
flipPlayer :: Player -> Player
flipPlayer Adam = Eve
flipPlayer _ = Adam

-- | le type des solution.
-- Une solution est une fonction (partielle)
-- qui associe à chaque position le joueur qui possède une stratégie  gagnante
-- depuis cette position
-- ici, une telle fonction partielle est realisée come une liste associative
type Solution a = [(a,Player)] 

-- | resoure un jeu
solve :: (Game a,Ord a) => a -> Solution a
solve position = []

-- | joueur une jeu
play :: (Game a,Ord a,Show a) => a -> IO ()
play position =
    let
        solution = solve position
    in
      return ()