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