Craft3e-0.1.0.2: Chapter16/Queues3.hs
-------------------------------------------------------------------------
--
-- Queues3.hs
--
-- An abstract data type of queues, implemnted as two lists, with
-- new elements added at the beginning of the second list.
--
-- (c) Addison-Wesley, 1996-2011.
--
-------------------------------------------------------------------------
module Queues3
( Queue ,
emptyQ , -- Queue a
isEmptyQ , -- Queue a -> Bool
addQ , -- a -> Queue a -> Queue a
remQ -- Queue a -> ( a , Queue a )
) where
data Queue a = Queue [a] [a]
emptyQ :: Queue a
emptyQ = Queue [] []
isEmptyQ :: Queue a -> Bool
isEmptyQ (Queue [] []) = True
isEmptyQ _ = False
addQ :: a -> Queue a -> Queue a
addQ x (Queue xs ys) = Queue xs (x:ys)
remQ :: Queue a -> ( a , Queue a )
remQ (Queue (x:xs) ys) = (x , Queue xs ys)
remQ (Queue [] ys@(z:zs)) = remQ (Queue (reverse ys) [])
remQ (Queue [] []) = error "remQ"