%               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}

