diff --git a/package.yaml b/package.yaml index f66642a5b01831872db3e3344c9f1ce70e690a2b..09d57a59096faa8ddcdd54c66a8594d65c6472d7 100644 --- a/package.yaml +++ b/package.yaml @@ -22,6 +22,8 @@ description: Please see the README on GitHub at <https://github.com/gith dependencies: - base >= 4.7 && < 5 - random >= 1.1 +- containers +- array library: source-dirs: src @@ -36,6 +38,7 @@ executables: - -with-rtsopts=-N dependencies: - twenty-one + - transformers tests: twenty-one-test: diff --git a/src/Card.hs b/src/Card.hs new file mode 100644 index 0000000000000000000000000000000000000000..3f3ad3507636ca68801ec428ffb0a487605a76fa --- /dev/null +++ b/src/Card.hs @@ -0,0 +1,32 @@ +module Card +( Suit (..) +, Value (..) +, Card (..) +) where + +data Suit = Spades | Diamonds | Clubs | Hearts + deriving (Eq,Ord,Enum,Bounded,Show,Read) + +data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace + deriving (Eq,Ord,Enum,Bounded,Show,Read) + +data Card = Card { _suit :: Suit + ,_value :: Value + } deriving (Eq, Show) + +type Deck = [Card] + +allCardValues :: [Value] +allCardValues = [minBound..maxBound] :: [Value] + +allCardSuits :: [Suit] +allCardSuits = [minBound..maxBound] :: [Suit] + +deck :: Deck +deck = Card <$> allCardSuits <*> allCardValues + +showCard :: Card -> String +showCard (Card {_suit = s, _value = v}) = show v ++ " of " ++ show s + +pullCardFromDeck :: Deck -> Int -> Card +pullCardFromDeck deck num = deck!!num \ No newline at end of file diff --git a/src/Lib.hs b/src/Lib.hs index 1ccd16786b03c16c20dd006b839b1cb77a7d3f0c..17659664d725e6d69007955ffe86995c1cfc0b6b 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -2,10 +2,31 @@ module Lib ( generateNumber ) where -import System.Random (randomRIO) +import System.Random +import Data.Map +import Data.Array.IO +import Control.Monad generateNumber:: Int -> Int -> Int -> IO () generateNumber min max n = do number <- randomRIO (min, max) -- :: IO Integer putStrLn $ "The number " ++ show n ++ " is " ++ show number + + +-- | Randomly shuffle a list +-- /O(N)/ +shuffle :: [a] -> IO [a] +shuffle xs = do + ar <- newArray n xs + forM [1..n] $ \i -> do + j <- randomRIO (i,n) + vi <- readArray ar i + vj <- readArray ar j + writeArray ar j vi + return vj + where + n = length xs + newArray :: Int -> [a] -> IO (IOArray Int a) + newArray n xs = newListArray (1,n) xs +