module Data.Graph.Inductive.Internal.Queue( -- * Type Queue(..), -- * Operations 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)