Просмотр исходного кода

put dequeue/enqueue into a type class.

Lucas Stadler лет назад: 11
Родитель
Сommit
3e3291d5f1
1 измененных файлов с 16 добавлено и 6 удалено
  1. 16 6
      hs/DataStructures.hs

+ 16 - 6
hs/DataStructures.hs

113
    isEmpty Nil = True
113
    isEmpty Nil = True
114
    isEmpty _ = False
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
-- fifo, remove from front, insert into rear
121
-- fifo, remove from front, insert into rear
117
data BankersQueue a = BankersQueue {
122
data BankersQueue a = BankersQueue {
118
                          frontSize :: Integer,
123
                          frontSize :: Integer,
121
                          rear :: List a
126
                          rear :: List a
122
                      } deriving (Show)
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
dequeueN 0 q = Nothing
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
dequeueN n q = dequeue q >>= \(_, q') -> dequeueN (n-1) q'
143
dequeueN n q = dequeue q >>= \(_, q') -> dequeueN (n-1) q'
134
144
135
check q@(BankersQueue fs f rs r) =
145
check q@(BankersQueue fs f rs r) =