lib/src/Hanafuda/KoiKoi/Game.hs

54 lines
1.2 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, 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