{-# LANGUAGE ExistentialQuantification #-} module Player where import Control.Monad.IO.Class import Card import Pile class (Monad m, MonadIO m) => MonadPlayer m where trumpColour :: m Colour turnColour :: m (Maybe Colour) showSkat :: Player p => p -> m (Maybe [Card]) class (Monad m, MonadIO m, MonadPlayer m) => MonadPlayerOpen m where showPiles :: m (Piles) class Player p where team :: p -> Team hand :: p -> Hand chooseCard :: MonadPlayer m => p -> [CardS Played] -> [CardS Played] -> [Card] -> m (Card, p) onCardPlayed :: MonadPlayer m => p -> CardS Played -> m p onCardPlayed p _ = return p chooseCardOpen :: MonadPlayerOpen m => p -> m Card chooseCardOpen p = do piles <- showPiles let table = tableCardsS piles fallen = played piles myCards = handCards (hand p) piles fmap fst $ chooseCard p table fallen myCards data PL = forall p. (Show p, Player p) => PL p instance Show PL where show (PL p) = show p instance Player PL where team (PL p) = team p hand (PL p) = hand p chooseCard (PL p) table fallen hand = do (v, a) <- chooseCard p table fallen hand return $ (v, PL a) onCardPlayed (PL p) card = do v <- onCardPlayed p card return $ PL v chooseCardOpen (PL p) = chooseCardOpen p data Players = Players PL PL PL deriving Show player :: Players -> Hand -> PL player (Players p _ _) Hand1 = p player (Players _ p _) Hand2 = p player (Players _ _ p) Hand3 = p updatePlayer :: (Show p, Player p) => p -> Players -> Players updatePlayer p (Players p1 p2 p3) = case hand p of Hand1 -> Players (PL p) p2 p3 Hand2 -> Players p1 (PL p) p3 Hand3 -> Players p1 p2 (PL p) playersToList :: Players -> [PL] playersToList (Players p1 p2 p3) = [p1, p2, p3]