coroutine-object-0.1: src/Control/Monad/Trans/Crtn/Queue.hs
{-# LANGUAGE StandaloneDeriving #-}
module Control.Monad.Trans.Crtn.Queue where
---------------------------
-- queue
---------------------------
data Queue a = Queue { fqueue :: [a]
, bqueue :: [a] }
deriving instance (Show a) => Show (Queue a)
emptyQueue :: Queue a
emptyQueue = Queue [] []
enqueue :: a -> Queue a -> Queue a
enqueue y (Queue xs ys) = Queue xs (y:ys)
dequeue :: Queue a -> (Queue a, Maybe a)
dequeue (Queue (x:xs) ys) = (Queue xs ys, Just x)
dequeue q@(Queue [] []) = (q,Nothing)
dequeue (Queue [] ys) = dequeue (Queue (reverse ys) [])