diff options
Diffstat (limited to 'src/Mahjong/Tile.hs')
-rw-r--r-- | src/Mahjong/Tile.hs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/Mahjong/Tile.hs b/src/Mahjong/Tile.hs new file mode 100644 index 0000000..05e2f89 --- /dev/null +++ b/src/Mahjong/Tile.hs @@ -0,0 +1,45 @@ +module Tile where + +import Data.Char (toUpper) +import Data.List (sort) +import Data.Maybe +import Control.Monad + +data MCol = Man | Pin | Sou | Cha + deriving (Eq,Ord) +data MTile = MTile MCol Int + deriving (Eq,Ord) + +charMcol = [(Man,'M'),(Pin,'P'),(Sou,'S'),(Cha,'C')] +instance Show MCol where + show x = [snd a | a <-charMcol, fst a == x] + +instance Read MCol where + readsPrec p r = [(fst a,t)|(c,t) <- lex r, a <- charMcol, map toUpper c == [snd a]] + +instance Show MTile where + show (MTile a b) = show b ++ show a + +instance Read MTile where + readsPrec p r = [ (MTile col n,u) | (c1,t)<- lex r, + let n = (read c1)::Int, + (c2,u) <-lex t, + let col=(read c2)::MCol] + +isCha c@(MTile col n) = (col == Cha) +isLaoTou c@(MTile col n) = ((n == 1) || (n == 9)) && (not $ isCha c) +is19 c@(MTile col n) = (isCha c) || (isLaoTou c) + +orderedTile = sort $ [MTile c n | c<-[Man,Pin,Sou], n <-[1..9]] ++ (map (MTile Cha) [1..7]) + +nextTile p = if xs /= [] then Just $ head xs + else Nothing + where (x:xs) = dropWhile (/= p) orderedTile + +nextTile' :: Maybe MTile -> Maybe MTile +nextTile' jp = do + p <- jp + nx@(MTile c n) <- nextTile p + guard ((c /= Cha) && (n /= 9)) + return nx + |