diplomacy-0.1.0.0: Diplomacy/Turn.hs
{-|
Module : Diplomacy.Turn
Description : Definition of a turn in a game of Diplomacy.
Copyright : (c) Alexander Vieth, 2015
Licence : BSD3
Maintainer : aovieth@gmail.com
Stability : experimental
Portability : non-portable (GHC only)
-}
{-# LANGUAGE AutoDeriveTypeable #-}
{-# LANGUAGE StandaloneDeriving #-}
module Diplomacy.Turn (
Turn
, firstTurn
, nextTurn
, prevTurn
, turnToInt
, turnFromInt
) where
import Data.TypeNat.Nat
newtype Turn = Turn Nat
deriving instance Eq Turn
deriving instance Ord Turn
instance Show Turn where
show = show . turnToInt
firstTurn = Turn Z
nextTurn :: Turn -> Turn
nextTurn (Turn n) = Turn (S n)
prevTurn :: Turn -> Maybe Turn
prevTurn (Turn Z) = Nothing
prevTurn (Turn (S n)) = Just (Turn n)
turnToInt :: Turn -> Int
turnToInt (Turn Z) = 0
turnToInt (Turn (S n)) = 1 + turnToInt (Turn n)
turnFromInt :: Int -> Maybe Turn
turnFromInt i | i < 0 = Nothing
| i == 0 = Just firstTurn
| otherwise = fmap nextTurn (turnFromInt (i-1))