Selaa lähdekoodia

put dequeue/enqueue into a type class.

Lucas Stadler 11 vuotta sitten
vanhempi
commit
3e3291d5f1
1 muutettua tiedostoa jossa 16 lisäystä ja 6 poistoa
  1. 16 6
      hs/DataStructures.hs

+ 16 - 6
hs/DataStructures.hs

@ -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) =