lib/src/Hanafuda/KoiKoi/Game.hs

53 lines
1.4 KiB
Haskell

{-# 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