module Data.Graph.Inductive.Internal.Queue(
-- * Type
Queue(..),
-- * Operations
mkQueue, queuePut, queuePutList, queueGet, queueEmpty ) where data
Queue
a
=
MkQueue
[
a
] [
a
]
mkQueue
::
Queue
a
mkQueue
=
MkQueue
[] []
queuePut
::
a
->
Queue
a
->
Queue
a
queuePut
item
(
MkQueue
ins
outs
) =
MkQueue
(
item
:
ins
)
outs
queuePutList
:: [
a
] ->
Queue
a
->
Queue
a
queuePutList
[]
q
=
q
queuePutList
(
x
:
xs
)
q
=
queuePutList
xs
(
queuePut
x
q
)
queueGet
::
Queue
a
-> (
a
,
Queue
a
)
queueGet
(
MkQueue
ins
(
item
:
rest
)) = (
item
,
MkQueue
ins
rest
)
queueGet
(
MkQueue
ins
[]) =
queueGet
(
MkQueue
[] (
reverse
ins
))
queueEmpty
::
Queue
a
->
Bool
queueEmpty
(
MkQueue
ins
outs
) = (
null
ins
)
&&
(
null
outs
)