module Queue(QUEUE, qmember, isempty, qremove, enter, empty) where

data QUEUE a = Queue [a] [a]  deriving (QUEUE a -> QUEUE a -> Bool
(QUEUE a -> QUEUE a -> Bool)
-> (QUEUE a -> QUEUE a -> Bool) -> Eq (QUEUE a)
forall a. Eq a => QUEUE a -> QUEUE a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: QUEUE a -> QUEUE a -> Bool
$c/= :: forall a. Eq a => QUEUE a -> QUEUE a -> Bool
== :: QUEUE a -> QUEUE a -> Bool
$c== :: forall a. Eq a => QUEUE a -> QUEUE a -> Bool
Eq, Eq (QUEUE a)
Eq (QUEUE a)
-> (QUEUE a -> QUEUE a -> Ordering)
-> (QUEUE a -> QUEUE a -> Bool)
-> (QUEUE a -> QUEUE a -> Bool)
-> (QUEUE a -> QUEUE a -> Bool)
-> (QUEUE a -> QUEUE a -> Bool)
-> (QUEUE a -> QUEUE a -> QUEUE a)
-> (QUEUE a -> QUEUE a -> QUEUE a)
-> Ord (QUEUE a)
QUEUE a -> QUEUE a -> Bool
QUEUE a -> QUEUE a -> Ordering
QUEUE a -> QUEUE a -> QUEUE a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (QUEUE a)
forall a. Ord a => QUEUE a -> QUEUE a -> Bool
forall a. Ord a => QUEUE a -> QUEUE a -> Ordering
forall a. Ord a => QUEUE a -> QUEUE a -> QUEUE a
min :: QUEUE a -> QUEUE a -> QUEUE a
$cmin :: forall a. Ord a => QUEUE a -> QUEUE a -> QUEUE a
max :: QUEUE a -> QUEUE a -> QUEUE a
$cmax :: forall a. Ord a => QUEUE a -> QUEUE a -> QUEUE a
>= :: QUEUE a -> QUEUE a -> Bool
$c>= :: forall a. Ord a => QUEUE a -> QUEUE a -> Bool
> :: QUEUE a -> QUEUE a -> Bool
$c> :: forall a. Ord a => QUEUE a -> QUEUE a -> Bool
<= :: QUEUE a -> QUEUE a -> Bool
$c<= :: forall a. Ord a => QUEUE a -> QUEUE a -> Bool
< :: QUEUE a -> QUEUE a -> Bool
$c< :: forall a. Ord a => QUEUE a -> QUEUE a -> Bool
compare :: QUEUE a -> QUEUE a -> Ordering
$ccompare :: forall a. Ord a => QUEUE a -> QUEUE a -> Ordering
$cp1Ord :: forall a. Ord a => Eq (QUEUE a)
Ord)

empty :: QUEUE a
empty = [a] -> [a] -> QUEUE a
forall a. [a] -> [a] -> QUEUE a
Queue [] []

enter :: QUEUE a -> a -> QUEUE a
enter (Queue [a]
outl' [a]
inl) a
x = [a] -> [a] -> QUEUE a
forall a. [a] -> [a] -> QUEUE a
Queue [a]
outl' (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
inl)

isempty :: QUEUE a -> Bool
isempty (Queue [] []) = Bool
True
isempty QUEUE a
_ = Bool
False

qremove :: QUEUE a -> Maybe (a, QUEUE a)
qremove (Queue (a
a : [a]
outl') [a]
inl) = (a, QUEUE a) -> Maybe (a, QUEUE a)
forall a. a -> Maybe a
Just (a
a, [a] -> [a] -> QUEUE a
forall a. [a] -> [a] -> QUEUE a
Queue [a]
outl' [a]
inl)
qremove (Queue [] []) = Maybe (a, QUEUE a)
forall a. Maybe a
Nothing --error "qremove from empty queue"
qremove (Queue [] [a]
inl) = QUEUE a -> Maybe (a, QUEUE a)
qremove ([a] -> [a] -> QUEUE a
forall a. [a] -> [a] -> QUEUE a
Queue ([a] -> [a]
forall a. [a] -> [a]
reverse [a]
inl) [])

qmember :: QUEUE a -> a -> Bool
qmember (Queue [a]
outl' [a]
inl) a
x = a
x a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a]
outl' Bool -> Bool -> Bool
|| a
x a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [a]
inl