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
+