module Util.Queue (
Queue,
emptyQ,
singletonQ,
isEmptyQ,
insertQ,
removeQ,
insertAtEndQ,
listToQueue,
queueToList,
) where
data Queue a = Queue [a] [a]
instance Eq a => Eq (Queue a) where
(Queue [a]
f1 [a]
r1) == :: Queue a -> Queue a -> Bool
== (Queue [a]
f2 [a]
r2) =
([a]
f1 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
r1) [a] -> [a] -> Bool
forall a. Eq a => a -> a -> Bool
== ([a]
f2 [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
r2)
instance Functor Queue where
fmap :: (a -> b) -> Queue a -> Queue b
fmap a -> b
f (Queue [a]
l1 [a]
l2) = [b] -> [b] -> Queue b
forall a. [a] -> [a] -> Queue a
Queue ((a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f [a]
l1) ((a -> b) -> [a] -> [b]
forall a b. (a -> b) -> [a] -> [b]
map a -> b
f [a]
l2)
emptyQ :: Queue a
emptyQ :: Queue a
emptyQ = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [] []
singletonQ :: a -> Queue a
singletonQ :: a -> Queue a
singletonQ a
e = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [] [a
e]
isEmptyQ :: Queue a -> Bool
isEmptyQ :: Queue a -> Bool
isEmptyQ (Queue [] []) = Bool
True
isEmptyQ Queue a
_ = Bool
False
insertQ :: Queue a -> a -> Queue a
insertQ :: Queue a -> a -> Queue a
insertQ (Queue [a]
fl [a]
rl) a
e = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue (a
ea -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
fl) [a]
rl
removeQ :: Queue a -> Maybe (a, Queue a)
removeQ :: Queue a -> Maybe (a, Queue a)
removeQ (Queue [] [] ) = Maybe (a, Queue a)
forall a. Maybe a
Nothing
removeQ (Queue [a]
fl [] ) = (a, Queue a) -> Maybe (a, Queue a)
forall a. a -> Maybe a
Just (a
x, [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [] [a]
tl) where (a
x : [a]
tl) = [a] -> [a]
forall a. [a] -> [a]
reverse [a]
fl
removeQ (Queue [a]
fl [a]
rl ) = (a, Queue a) -> Maybe (a, Queue a)
forall a. a -> Maybe a
Just ([a] -> a
forall a. [a] -> a
head [a]
rl, [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [a]
fl ([a] -> [a]
forall a. [a] -> [a]
tail [a]
rl))
insertAtEndQ :: Queue a -> a -> Queue a
insertAtEndQ :: Queue a -> a -> Queue a
insertAtEndQ (Queue [a]
fl [a]
rl) a
next = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [a]
fl (a
nexta -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
rl)
listToQueue :: [a] -> Queue a
listToQueue :: [a] -> Queue a
listToQueue [a]
xs = (Queue a -> a -> Queue a) -> Queue a -> [a] -> Queue a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Queue a -> a -> Queue a
forall a. Queue a -> a -> Queue a
insertQ Queue a
forall a. Queue a
emptyQ [a]
xs
queueToList :: Queue a -> [a]
queueToList :: Queue a -> [a]
queueToList (Queue [a]
fl [a]
rl) = [a]
rl [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
fl