module Q where import Test.QuickCheck data Q a = Q [a] [a] deriving (Eq,Show) ---------------------------- empty :: Q a add :: a -> Q a -> Q a remove :: Q a -> Q a front :: Q a -> a isEmpty :: Q a -> Bool --------------------------- empty = Q [] [] add x (Q fs bs) = q fs (x:bs) remove (Q (f:fs) bs) = q fs bs isEmpty (Q fs bs) = null fs -- && null bs front (Q (f:fs) bs) = f -- smart constructor q :: [a] -> [a] -> Q a q [] bs = Q (reverse bs) [] q fs bs = Q fs bs -- invariant -- properties of operators -- Equivalence of slow and fast queues -- convert :: Q Int -> SlowQ.Q Int {- -- Random generator for queues -- For now this is magic; see lecture 3B! instance Arbitrary a => Arbitrary (Q a) where arbitrary = do front <- arbitrary back <- arbitrary return (q front back) -}