|
|
@ -113,6 +113,11 @@ instance Seq List where
|
|
113
|
113
|
isEmpty Nil = True
|
|
114
|
114
|
isEmpty _ = False
|
|
115
|
115
|
|
|
|
116
|
class Queue q where
|
|
|
117
|
enqueue :: a -> q a -> q a
|
|
|
118
|
|
|
|
119
|
dequeue :: q a -> Maybe (a, q a)
|
|
|
120
|
|
|
116
|
121
|
-- fifo, remove from front, insert into rear
|
|
117
|
122
|
data BankersQueue a = BankersQueue {
|
|
118
|
123
|
frontSize :: Integer,
|
|
|
@ -121,18 +126,20 @@ data BankersQueue a = BankersQueue {
|
|
121
|
126
|
rear :: List a
|
|
122
|
127
|
} deriving (Show)
|
|
123
|
128
|
|
|
124
|
|
enqueue x (BankersQueue fs f rs r) = check $ BankersQueue fs f (rs + 1) (cons x r)
|
|
|
129
|
instance Queue BankersQueue where
|
|
|
130
|
enqueue x (BankersQueue fs f rs r) = check $ BankersQueue fs f (rs + 1) (cons x r)
|
|
125
|
131
|
|
|
126
|
|
dequeue (BankersQueue fs Nil rs Nil) = Nothing
|
|
127
|
|
--dequeue (BankersQueue fs Nil rs r) = Just (x, check $ BankersQueue fs Nil (rs - 1) r')
|
|
128
|
|
dequeue (BankersQueue fs (Cons x fr) rs r) =
|
|
129
|
|
Just (x, check $ BankersQueue (fs - 1) fr rs r)
|
|
|
132
|
dequeue (BankersQueue fs Nil rs Nil) = Nothing
|
|
|
133
|
-- not needed because of `check` invariant?
|
|
|
134
|
--dequeue (BankersQueue fs Nil rs r) = Just (x, check $ BankersQueue fs Nil (rs - 1) r')
|
|
|
135
|
-- where (Just x) = last r
|
|
|
136
|
-- r' = butLast r
|
|
|
137
|
dequeue (BankersQueue fs (Cons x fr) rs r) =
|
|
|
138
|
Just (x, check $ BankersQueue (fs - 1) fr rs r)
|
|
130
|
139
|
|
|
|
140
|
dequeueN :: Queue q => Integer -> q a -> Maybe (a, q a)
|
|
131
|
141
|
dequeueN 0 q = Nothing
|
|
132
|
|
dequeueN 1 q = dequeue q >>= \(x, _) -> return x
|
|
|
142
|
dequeueN 1 q = dequeue q >>= \(x, q) -> return (x, q)
|
|
133
|
143
|
dequeueN n q = dequeue q >>= \(_, q') -> dequeueN (n-1) q'
|
|
134
|
144
|
|
|
135
|
145
|
check q@(BankersQueue fs f rs r) =
|