module Control.Search.Local.Queue where

data Queue a = Queue [a] [a] Int

initQ :: Queue a
initQ = Queue [] [] 0

sizeQ :: Queue a->Int
sizeQ (Queue _ _ s) = s

append :: Queue a -> a -> Queue a
append (Queue fr bk sz) x = Queue fr (x:bk) (1+sz)

remove :: Queue a->Queue a
remove q@(Queue [] [] _ ) = q
remove (Queue [] bk sz) = remove (Queue (reverse bk) [] sz)
remove (Queue as bk sz) = Queue (tail as) bk (sz-1) 

toList :: Queue a->[a]
toList (Queue fr bk _) = fr ++ reverse bk