module Data.Graph.Inductive.Internal.Queue
       (Queue(..), mkQueue, queuePut, queuePutList, queueGet, queueEmpty)
       where
{  
  data Queue a = MkQueue [a] [a];
   
  mkQueue :: Queue a;
  mkQueue = MkQueue [] [];
   
  queuePut :: a -> Queue a -> Queue a;
  queuePut item (MkQueue ins outs) = MkQueue (item : ins) outs;
   
  queuePutList :: [a] -> Queue a -> Queue a;
  queuePutList [] q = q;
  queuePutList (x : xs) q = queuePutList xs (queuePut x q);
   
  queueGet :: Queue a -> (a, Queue a);
  queueGet (MkQueue ins (item : rest)) = (item, MkQueue ins rest);
  queueGet (MkQueue ins []) = queueGet (MkQueue [] (reverse ins));
   
  queueEmpty :: Queue a -> Bool;
  queueEmpty (MkQueue ins outs) = (null ins) && (null outs)}
