{-# LANGUAGE NamedFieldPuns #-} module Skat where import Control.Monad.State import Control.Monad.Reader import Data.List import Card import Pile import Player data SkatEnv = SkatEnv { piles :: Piles , turnColour :: Maybe Colour , trumpColour :: Colour , players :: Players } deriving Show type Skat = StateT SkatEnv IO modifyp :: (Piles -> Piles) -> Skat () modifyp f = modify g where g env@(SkatEnv {piles}) = env { piles = f piles} getp :: (Piles -> a) -> Skat a getp f = gets piles >>= return . f setTurnColour :: Maybe Colour -> SkatEnv -> SkatEnv setTurnColour col sk = sk { turnColour = col }