-------------------------------------------------------------------------
--  
--         Queues2.hs
--  
--         An abstract data type of queues, implemnted as a list, with
--         new elements added at the beginning of the list.
--                                  
--         (c) Addison-Wesley, 1996-2011.                   
--  
-------------------------------------------------------------------------                      

module Queues2 
  ( Queue , 
    emptyQ ,       --  Queue a
    isEmptyQ ,     --  Queue a -> Bool 
    addQ ,         --  a -> Queue a -> Queue a
    remQ           --  Queue a -> (  a , Queue a )
   ) where 

newtype Queue a = Queue [a]
--  
emptyQ :: Queue a

emptyQ :: forall a. Queue a
emptyQ = [a] -> Queue a
forall a. [a] -> Queue a
Queue []

isEmptyQ :: Queue a -> Bool

isEmptyQ :: forall a. Queue a -> Bool
isEmptyQ (Queue []) = Bool
True
isEmptyQ Queue a
_       = Bool
False

addQ   :: a -> Queue a -> Queue a

addQ :: forall a. a -> Queue a -> Queue a
addQ a
x (Queue [a]
xs) = [a] -> Queue a
forall a. [a] -> Queue a
Queue (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)

remQ   :: Queue a -> (  a , Queue a )

remQ :: forall a. Queue a -> (a, Queue a)
remQ q :: Queue a
q@(Queue [a]
xs)
  | Bool -> Bool
not (Queue a -> Bool
forall a. Queue a -> Bool
isEmptyQ Queue a
q)   = ([a] -> a
forall a. HasCallStack => [a] -> a
last [a]
xs , [a] -> Queue a
forall a. [a] -> Queue a
Queue ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
init [a]
xs))
  | Bool
otherwise          = [Char] -> (a, Queue a)
forall a. HasCallStack => [Char] -> a
error [Char]
"remQ"