Queues3.lhs
An abstract data type of queues, implemnted as two lists, with
new elements added at the beginning of the second list.
(c) Simon Thompson, 1998.
> module Queue
> ( Queue ,
> emptyQ , -- Queue a
> isEmptyQ , -- Queue a -> Bool
> addQ , -- a -> Queue a -> Queue a
> remQ -- Queue a -> ( a , Queue a )
> ) where
> data Queue a = Qu [a] [a]
> emptyQ :: Queue a
> emptyQ = Qu [] []
> isEmptyQ :: Queue a -> Bool
> isEmptyQ (Qu [] []) = True
> isEmptyQ _ = False
> addQ :: a -> Queue a -> Queue a
> addQ x (Qu xs ys) = Qu xs (x:ys)
> remQ :: Queue a -> ( a , Queue a )
> remQ (Qu (x:xs) ys) = (x , Qu xs ys)
> remQ (Qu [] ys) = remQ (Qu (reverse ys) [])
> remQ (Qu [] []) = error "remQ"