{-# 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, Seat) import Hanafuda.KoiKoi.Yaku (Score) import Data.Map (insert) 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 = On_ { mode :: Mode , scores :: Scores , month :: Flower , players :: Players Score , playing :: Seat , winning :: Seat , oyake :: Seat , stock :: [Card] , river :: Pack , step :: Step , trick :: [Card] } deriving (Show) data Over = Over_ { finalScores :: Scores } deriving (Show) data Game = Error String | Over Over | On On deriving (Show) setPlayer :: On -> Player Score -> On setPlayer on@(On_ {players, playing}) player = on {players = insert playing player players} end :: On -> IO Game end (On_ {scores}) = return . Over $ Over_ {finalScores = scores} stop :: On -> IO Game stop = return . On raise :: String -> IO Game raise = return . Error