module Events.DeleteQueue(
DeleteQueue,
emptyQueue,
addQueue,
removeQueue,
isEmptyQueue,
cleanQueue,
) where
import Util.Queue
import Events.Cells
newtype DeleteQueue v = DeleteQueue (Queue (Cell v))
emptyQueue :: DeleteQueue v
emptyQueue = DeleteQueue emptyQ
addQueue :: DeleteQueue v -> v -> IO (DeleteQueue v,IO ())
addQueue (DeleteQueue queue) v =
do
cell <- newCell v
let deleteQueue1 = DeleteQueue (insertQ queue cell)
return (deleteQueue1,emptyCell cell)
cleanQueue :: DeleteQueue v -> IO (DeleteQueue v)
cleanQueue deleteQueue@(DeleteQueue queue) =
case removeQ queue of
Nothing -> return deleteQueue
Just (cell,queue2) ->
do
cellContents <- inspectCell cell
case cellContents of
Nothing -> cleanQueue (DeleteQueue queue2)
Just _ -> return (DeleteQueue (insertAtEndQ queue2 cell))
isEmptyQueue :: DeleteQueue v -> IO (Maybe (DeleteQueue v))
isEmptyQueue deleteQueue@(DeleteQueue queue) =
case removeQ queue of
Nothing -> return Nothing
Just (cell,queue2) ->
do
cellContents <- inspectCell cell
case cellContents of
Nothing -> isEmptyQueue (DeleteQueue queue2)
Just _ ->
return (Just (DeleteQueue (insertAtEndQ queue2 cell)))
removeQueue :: DeleteQueue v -> IO (Maybe (v,DeleteQueue v,DeleteQueue v))
removeQueue (DeleteQueue queue) =
case removeQ queue of
Nothing -> return Nothing
Just (cell,queue2) ->
do
vOpt <- inspectCell cell
case vOpt of
Nothing -> removeQueue (DeleteQueue queue2)
Just v ->
return (Just(v,DeleteQueue queue2,
DeleteQueue(insertAtEndQ queue2 cell)))