packages feed

elm-make-0.1: src/Utils/Queue.hs

module Utils.Queue where


newtype Queue a =
    Queue ([a], [a])


empty :: Queue a
empty =
    Queue ([],[])


fromList :: [a] -> Queue a
fromList list =
    Queue (list, [])


size :: Queue a -> Int
size (Queue (front, back)) =
    length front + length back


enqueue :: [a] -> Queue a -> Queue a
enqueue names (Queue (front, back)) =
    Queue (front, names ++ back)


dequeue :: Int -> Queue a -> ([a], Queue a)
dequeue n queue =
    dequeueHelp [] n queue


dequeueHelp :: [a] -> Int -> Queue a -> ([a], Queue a)
dequeueHelp results n queue@(Queue (front, back)) =
  case n of
    0 -> (results, queue)
    _ ->
      case (front, back) of
        ([],  []) -> (results, queue)
        ([],   _) -> dequeueHelp results n (Queue (reverse back, []))
        (x:xs, _) -> dequeueHelp (x:results) (n-1) (Queue (xs, back))