Mercurial > 12ws.info2
view exercises/src/SuperQueue.hs @ 30:8bf7ca2663d2
Advanced AdditionParser
author | Markus Kaiser <markus.kaiser@in.tum.de> |
---|---|
date | Sat, 12 Jan 2013 14:36:43 +0000 |
parents | ea3fba2381bc |
children |
line wrap: on
line source
module SuperQueue (Queue, empty, enqueue, dequeue) where import Test.QuickCheck import Test.QuickCheck.Poly (A) data Queue a = Queue [a] [a] empty :: Queue a empty = Queue [] [] isEmpty :: Queue a -> Bool isEmpty (Queue [] []) = True isEmpty _ = False enqueue :: a -> Queue a -> Queue a enqueue x (Queue front kcab) = Queue front (x : kcab) dequeue :: Queue a -> (a, Queue a) dequeue (Queue [] kcab) = dequeue (Queue (reverse kcab) []) dequeue (Queue front kcab) = (head front, Queue (tail front) kcab) toList :: Queue a -> [a] toList (Queue front kcab) = front ++ reverse kcab instance Eq a => Eq (Queue a) where q == q' = toList q == toList q' instance Show a => Show (Queue a) where show = show . toList {- QuickCheck Tests -} instance Arbitrary a => Arbitrary (Queue a) where arbitrary = do front <- arbitrary kcab <- arbitrary return $ Queue front kcab 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'