module Queues2
( Queue ,
emptyQ ,
isEmptyQ ,
addQ ,
remQ
) where
newtype Queue a = Queue [a]
emptyQ :: Queue a
emptyQ :: forall a. Queue a
emptyQ = [a] -> Queue a
forall 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] -> Queue a
forall a. [a] -> Queue a
Queue (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs)
remQ :: Queue a -> ( a , Queue a )
remQ :: forall a. Queue a -> (a, Queue a)
remQ q :: Queue a
q@(Queue [a]
xs)
| Bool -> Bool
not (Queue a -> Bool
forall a. Queue a -> Bool
isEmptyQ Queue a
q) = ([a] -> a
forall a. HasCallStack => [a] -> a
last [a]
xs , [a] -> Queue a
forall a. [a] -> Queue a
Queue ([a] -> [a]
forall a. HasCallStack => [a] -> [a]
init [a]
xs))
| Bool
otherwise = [Char] -> (a, Queue a)
forall a. HasCallStack => [Char] -> a
error [Char]
"remQ"