Skip to content

Instantly share code, notes, and snippets.

@osa1
Created February 17, 2017 07:08
Show Gist options
  • Save osa1/6427742c411bb53d6894f564e3fde4dd to your computer and use it in GitHub Desktop.
Save osa1/6427742c411bb53d6894f564e3fde4dd to your computer and use it in GitHub Desktop.
data Queue a = Queue { _front :: [a], _back :: [a] }
module Data.Queue
( Queue
, newQueue
, enqueue
, dequeue
, filterQueue
) where
-- | A functional queue.
data Queue a = Queue { _front :: [a], _back :: [a] }
newQueue :: Queue a
newQueue = Queue [] []
enqueue :: a -> Queue a -> Queue a
enqueue a (Queue f b) = Queue f (a : b)
dequeue :: Queue a -> Maybe (a, Queue a)
dequeue (Queue [] []) = Nothing
dequeue (Queue [] b ) = dequeue (Queue (reverse b) [])
dequeue (Queue (h : t) b ) = Just (h, Queue t b)
filterQueue :: (a -> Bool) -> Queue a -> Queue a
filterQueue p (Queue f b) = Queue (filter p f) (filter p b)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment