module Queue(Qu, empty, isEmpty, enq, first, deq) where data Qu a = Qu [a] [a] empty = Qu [] [] empty :: Qu a isEmpty :: Qu a-> Bool enq :: a-> Qu a-> Qu a first :: Qu a-> a deq :: Qu a-> Qu a isEmpty (Qu xs _) = null xs first (Qu [] _) = error "Qu: first of mt Q" first (Qu (x:xs) _) = x enq x (Qu xs ys) = check xs (x:ys) deq (Qu [] _ ) = error "Qu: deq of mt Q" deq (Qu (_:xs) ys) = check xs ys check [] ys = Qu (reverse ys) [] check xs ys = Qu xs ys