content: %               Filename:  Queue.lhs
  %               Version :  1.3
  %               Date    :  3/4/92
  
  \section{A Queue Abstract data type}
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \begin{code}
  module Queue(
  		Queue, createQueue, addFront, addBack,
  		addAllFront, addAllBack, inquireFront,
  		inquireBack, removeFront, removeBack, 
  		emptyQueue
  ) where
  \end{code}
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \begin{code}
  type Queue a = [a]
  \end{code}
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \begin{code}
  createQueue::Queue a
  createQueue = []
  
  addFront::a -> Queue a -> Queue a
  addFront x q = x:q
  
  addBack::a -> Queue a -> Queue a
  addBack x q = q ++ [x]
  
  addAllFront::[a] -> Queue a -> Queue a
  addAllFront list q = list ++ q
  
  addAllBack::[a] -> Queue a -> Queue a
  addAllBack list q = q ++ list
  
  inquireFront::Queue a -> a
  inquireFront []    = error "Cannot inquire on empty Queue"
  inquireFront (h:t) = h
  
  inquireBack::Queue a -> a
  inquireBack []     = error "Cannot inquire on empty Queue"
  inquireBack [x]    = x                 
  inquireBack (x:xs) = inquireBack xs
  
  removeFront::Queue a -> Queue a
  removeFront []    = error "Cannot remove from an empty Queue"
  removeFront (h:t) = t
  
  removeBack::Queue a -> Queue a
  removeBack []    = error "Cannot inquire on empty Queue"
  removeBack [x]   =  []                
  removeBack (x:xs) = x:(removeBack xs)
  
  emptyQueue::(Eq a) => Queue a -> Bool
  emptyQueue x = x==[]
  
  sizeQueue::Queue b -> Int
  sizeQueue xs =  length xs
  \end{code}
  
  