Queue

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

data QUEUE a = Queue [a] [a]  deriving (Eq, Ord)

empty = Queue [] []

enter (Queue outl' inl) x = Queue outl' (x : inl)

isempty (Queue [] []) = True
isempty _ = False

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

qmember (Queue outl' inl) x = x `elem` outl' || x `elem` inl