{-# LANGUAGE NamedFieldPuns #-} module Hanafuda.KoiKoi.Game ( Game(..) , Mode(..) , Move(..) , On(..) , Over(..) , Step(..) , end , raise , setPlayer , stop ) where import Hanafuda (Card, Flower, Pack) import Hanafuda.Player (Players, Player, Scores, set) import Hanafuda.KoiKoi.Yaku (Score) data Mode = FirstAt Int | WholeYear deriving (Show) data Move = Play Card | Capture (Card, Card) | Choose Card | KoiKoi Bool data Step = ToPlay | Turned Card | Scored deriving (Show) data On player = On_ { mode :: Mode , scores :: Scores player , month :: Flower , players :: Players player Score , playing :: player , winning :: player , oyake :: player , deck :: [Card] , river :: Pack , step :: Step , trick :: [Card] } deriving (Show) data Over player = Over_ { finalScores :: Scores player } deriving (Show) data Game player = Error String | Over (Over player) | On (On player) deriving (Show) setPlayer :: Ord player => On player -> Player player Score -> On player setPlayer on@(On_ {players, playing}) player = on {players = set playing player players} end :: Ord player => On player -> IO (Game player) end (On_ {scores}) = return . Over $ Over_ {finalScores = scores} stop :: Ord player => On player -> IO (Game player) stop = return . On raise :: String -> IO (Game player) raise = return . Error