module Queues3
( Queue ,
emptyQ ,
isEmptyQ ,
addQ ,
remQ
) where
data Queue a = Queue [a] [a]
emptyQ :: Queue a
emptyQ :: forall a. Queue a
emptyQ = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [] []
isEmptyQ :: Queue a -> Bool
isEmptyQ :: forall a. Queue a -> Bool
isEmptyQ (Queue [] []) = Bool
True
isEmptyQ Queue a
_ = Bool
False
addQ :: a -> Queue a -> Queue a
addQ :: forall a. a -> Queue a -> Queue a
addQ a
x (Queue [a]
xs [a]
ys) = [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [a]
xs (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
ys)
remQ :: Queue a -> ( a , Queue a )
remQ :: forall a. Queue a -> (a, Queue a)
remQ (Queue (a
x:[a]
xs) [a]
ys) = (a
x , [a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue [a]
xs [a]
ys)
remQ (Queue [] ys :: [a]
ys@(a
z:[a]
zs)) = Queue a -> (a, Queue a)
forall a. Queue a -> (a, Queue a)
remQ ([a] -> [a] -> Queue a
forall a. [a] -> [a] -> Queue a
Queue ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
ys) [])
remQ (Queue [] []) = [Char] -> (a, Queue a)
forall a. HasCallStack => [Char] -> a
error [Char]
"remQ"