3 | import public Data.HashPSQ.Internal
4 | import public Data.NatPSQ
5 | import public Data.NatPSQ.Internal
6 | import public Data.OrdPSQ
25 | -> Maybe (p, Bucket k p v)
26 | -> Maybe (p, Bucket k p v)
28 | Just (p, MkBucket k v (OrdPSQ.empty))
29 | ins k p v (Just (p', MkBucket k' v' os)) =
33 | Just (mkBucket k p v os)
35 | case p' < p || (p == p' && k' < k) of
37 | Just (p', MkBucket k' v' (OrdPSQ.insert k p v os))
39 | case OrdPSQ.member k os of
43 | Just (p, MkBucket k v (OrdPSQ.insert k' p' v' (OrdPSQ.delete k os)))
45 | Just (p, MkBucket k v (OrdPSQ.insert k' p' v' os))
60 | insert k p v (MkHashPSQ npsq) =
63 | NatPSQ.alter (\x => ((), ins k p v x)) (cast $
hash k) npsq
71 | empty : HashPSQ k p v
73 | MkHashPSQ NatPSQ.empty
77 | singleton : Hashable k
85 | Data.HashPSQ.insert k p v empty
93 | null : HashPSQ k p v
95 | null (MkHashPSQ npsq) =
100 | size : HashPSQ k p v
102 | size (MkHashPSQ npsq) =
103 | NatPSQ.fold (\_, _, (MkBucket _ _ opsq), acc => 1 + OrdPSQ.size opsq + acc)
110 | lookup : Hashable k
116 | lookup k (MkHashPSQ npsq) =
117 | let nsq' = NatPSQ.lookup (cast $
hash k) npsq
121 | Just (p0, MkBucket k0 v0 os) =>
130 | member : Hashable k
141 | notMember : Hashable k
153 | findMin : Hashable k
158 | findMin (MkHashPSQ npsq) =
159 | case NatPSQ.findMin npsq of
162 | Just (_, p, MkBucket k x _) =>
174 | -> Maybe (p, Bucket k p v)
175 | -> (Maybe (p, v), Maybe (p, Bucket k p v))
176 | deleteV _ Nothing =
178 | deleteV k (Just (p, MkBucket bk bx opsq)) =
181 | case OrdPSQ.minView opsq of
183 | (Just (p, bx), Nothing)
184 | Just (k', p', x', opsq') =>
185 | (Just (p, bx), Just (p', MkBucket k' x' opsq'))
187 | case OrdPSQ.deleteView k opsq of
190 | Just (p', x', opsq') =>
191 | (Just (p', x'), Just (p, MkBucket bk bx opsq'))
197 | deleteView : Hashable k
202 | -> Maybe (p, v, HashPSQ k p v)
203 | deleteView k (MkHashPSQ npsq) =
204 | case NatPSQ.alter (\x => deleteV k x) (cast $
hash k) npsq of
207 | (Just (p, x), npsq') =>
208 | Just (p, x, MkHashPSQ npsq')
214 | insertView : Hashable k
221 | -> (Maybe (p, v), HashPSQ k p v)
222 | insertView k p x t =
223 | case deleteView k t of
225 | (Nothing, insert k p x t)
226 | Just (p', x', _) =>
227 | (Just (p', x'), insert k p x t)
232 | => Maybe (a, b, Bucket k p v)
233 | -> (Maybe (k, b, v), Maybe (a, p, Bucket k p v))
236 | minV (Just (h, p, MkBucket k x os)) =
237 | case OrdPSQ.minView os of
239 | (Just (k, p, x), Nothing)
240 | Just (k', p', x', os') =>
241 | (Just (k, p, x), Just (h, p', MkBucket k' x' os'))
246 | minView : Hashable k
250 | -> Maybe (k, p, v, HashPSQ k p v)
251 | minView (MkHashPSQ npsq) =
252 | case NatPSQ.alterMin minV npsq of
255 | (Just (k, p, x), npsq') =>
256 | Just (k, p, x, MkHashPSQ npsq')
262 | atMostView : Hashable k
267 | -> (List (k, p, v), HashPSQ k p v)
268 | atMostView pt (MkHashPSQ t0) =
272 | (buckets, t1) = NatPSQ.atMostView pt t0
275 | (returns, reinserts) = go Nil Nil buckets
278 | (\t, (p, b@(MkBucket k _ _)) => NatPSQ.unsafeInsertNew (cast $
hash k) p b t)
282 | in (returns, MkHashPSQ t2)
285 | go : List (k, p, v)
286 | -> List (p, Bucket k p v)
287 | -> List (a, p, Bucket k p v)
288 | -> (List (k, p, v), List (p, Bucket k p v))
291 | go rets reins ((_, p, MkBucket k v opsq) :: bs) =
293 | let (elems, opsq') = OrdPSQ.atMostView pt opsq
294 | rets' = (k, p, v) :: elems ++ rets
295 | reins' = case toBucket opsq' of
300 | in go rets' reins' bs
309 | delete : Hashable k
316 | case deleteView k t of
326 | deleteMin : Hashable k
335 | Just (_, _, _, t') =>
349 | => (Maybe (p, v) -> (b, Maybe (p, v)))
352 | -> (b, HashPSQ k p v)
353 | alter f k (MkHashPSQ npsq) =
354 | let h = cast $
hash k
355 | in case NatPSQ.deleteView h npsq of
359 | (b, MkHashPSQ npsq)
360 | (b, Just (p, x)) =>
361 | (b, MkHashPSQ $
NatPSQ.unsafeInsertNew h p (MkBucket k x OrdPSQ.empty) npsq)
362 | Just (bp, MkBucket bk bx opsq, npsq') =>
365 | case f (Just (bp, bx)) of
367 | case toBucket opsq of
369 | (b, MkHashPSQ npsq')
370 | Just (bp', bucket') =>
371 | (b, MkHashPSQ $
NatPSQ.unsafeInsertNew h bp' bucket' npsq')
372 | (b, Just (p, x)) =>
373 | let (bp', bucket') = mkBucket k p x opsq
374 | in (b, MkHashPSQ $
NatPSQ.unsafeInsertNew h bp' bucket' npsq')
376 | let (b, opsq') = OrdPSQ.alter f k opsq
377 | (bp', bucket') = mkBucket bk bp bx opsq'
378 | in (b, MkHashPSQ $
NatPSQ.unsafeInsertNew h bp' bucket' npsq')
384 | alterMin : Hashable k
387 | => (Maybe (k, p, v) -> (b, Maybe (k, p, v)))
389 | -> (b, HashPSQ k p v)
391 | let (t, mbx) = case minView t0 of
394 | Just (k, p, x, t0') =>
395 | (t0', Just (k, p, x))
401 | (b, insert k p x t)
412 | map f (MkHashPSQ npsq) =
413 | MkHashPSQ (NatPSQ.map mapBucket npsq)
415 | mapBucket : Bucket k p v
417 | mapBucket (MkBucket k v opsq) =
418 | MkBucket k (f v) (OrdPSQ.map (\k', p', v' => f v') opsq)
428 | fromList : Hashable k
434 | foldl (\psq, (k, p, x) => insert k p x psq) empty
439 | toList : Hashable k
444 | toList (MkHashPSQ npsq) =
446 | | (_, p, (MkBucket k x opsq)) <- NatPSQ.toList npsq
447 | , (k', p', x') <- (k, p, x) :: OrdPSQ.toList opsq
458 | [k | (k, _, _) <- toList t]
465 | Functor (HashPSQ k p) where
466 | map = Data.HashPSQ.map