{-# 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) [])