view exercises/src/Queue.hs @ 23:f9386825bf71

week 10
author Markus Kaiser <markus.kaiser@in.tum.de>
date Wed, 19 Dec 2012 23:22:42 +0100
parents
children ea3fba2381bc
line wrap: on
line source

module Queue where
import Test.QuickCheck
import Test.QuickCheck.Poly (A)

newtype Queue a = Queue [a]
  deriving (Eq, Show)

empty :: Queue a
empty = undefined

isEmpty :: Queue a -> Bool
isEmpty (Queue xs) = undefined

enqueue :: a -> Queue a -> Queue a
enqueue x (Queue xs) = undefined

dequeue :: Queue a -> (a, Queue a)
dequeue (Queue (x : xs)) = undefined

toList :: Queue a -> [a]
toList (Queue xs) = undefined


{- QuickCheck Tests -}

instance Arbitrary a => Arbitrary (Queue a) where
  arbitrary =
    do
      xs <- arbitrary
      return $ Queue xs

prop_isEmpty_empty = isEmpty empty

prop_isEmpty_enqueue x q = not (isEmpty (enqueue (x :: A) q))

prop_toList_enqueue x q = toList (enqueue x q) == toList q ++ [x :: A]

prop_toList_dequeue x q =
  not (isEmpty q) ==> (x :: A) : toList q' == toList q
  where (x, q') = dequeue q

prop_toList_ext q q' =
  toList q == toList q' ==> (q :: Queue A) == q'