lib/CCard.hs

61 lines
1.0 KiB
Haskell

module CCard where
import Data.Word (Word64)
import Data.Bits (setBit, (.|.), (.&.), shift, xor)
newtype Card = Card Int
type Pack = Word64
data Flower =
Pine
| Plum
| Cherry
| Wisteria
| Iris
| Peony
| BushClover
| SusukiGrass
| Chrysanthemum
| Maple
| Willow
| Paulownia
deriving (Eq, Ord, Enum, Show)
flower :: Card -> Flower
flower (Card n) = toEnum $ n `div` 4
set :: [Int] -> Pack
set = foldl setBit 0
inoshikacho :: Pack
inoshikacho = set [23, 27, 39]
animals :: Pack
animals = set [7, 15, 19, 30, 35, 42] .|. inoshikacho
blue :: Pack
blue = set [22, 37, 41]
poetry :: Pack
poetry = set [2, 6, 10]
ribbons = set [14, 18, 26, 41] .|. blue .|. poetry
lights :: Pack
lights = set [3, 11, 31, 43, 47]
lastIndex :: Int
lastIndex = 47
plain :: Pack
plain = pack `xor` (lights .|. ribbons .|. animals) .&. pack
pack :: Pack
pack = 1 `shift` (lastIndex + 1) - 1
pair :: Card -> Card -> Bool
pair card1 card2 = flower card1 == flower card2
cards :: [Card]
cards = map Card [0..lastIndex]