{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module NetSpider.Queue
( Queue,
newQueue,
pushQueue,
popQueue
) where
import Data.Foldable (Foldable)
import Data.Monoid (Monoid)
import Data.Semigroup (Semigroup)
import Data.Sequence (Seq, (|>), viewl, ViewL(..), fromList)
import Data.Traversable (Traversable)
newtype Queue a = Queue (Seq a)
deriving (Show,Eq,Ord,Semigroup,Monoid,Foldable,Functor,Applicative,Monad)
newQueue :: [a] -> Queue a
newQueue = Queue . fromList
pushQueue :: a -> Queue a -> Queue a
pushQueue item (Queue s) = Queue (s |> item)
popQueue :: Queue a -> (Maybe a, Queue a)
popQueue q@(Queue s) =
case viewl s of
EmptyL -> (Nothing, q)
(item :< rest) -> (Just item, Queue rest)