3 | import public Data.NatPSQ.Internal
22 | link k p x k' k't othertree =
23 | let m = branchMask k k'
24 | in case zero m k' of
26 | Bin k p x m k't othertree
28 | Bin k p x m othertree k't
47 | case (lp, lk) < (rp, rk) of
49 | Bin lk lp lx m Nil r
51 | Bin rk rp rx m l Nil
52 | Bin rk rp rx rm rl rr =>
53 | case (lp, lk) < (rp, rk) of
55 | Bin lk lp lx m Nil r
57 | Bin rk rp rx m l (merge rm rl rr)
58 | Bin lk lp lx lm ll lr =>
63 | case (lp, lk) < (rp, rk) of
65 | Bin lk lp lx m (merge lm ll lr) r
67 | Bin rk rp rx m l Nil
68 | Bin rk rp rx rm rl rr =>
69 | case (lp, lk) < (rp, rk) of
71 | Bin lk lp lx m (merge lm ll lr) r
73 | Bin rk rp rx m l (merge rm rl rr)
84 | bin k p x _ Nil Nil =
91 | unsafeInsertNew : Ord p
97 | unsafeInsertNew k p x t =
102 | case (p, k) < (p', k') of
104 | link k p x k' t Nil
106 | link k' p' x' k (Tip k p x) Nil
107 | Bin k' p' x' m l r =>
108 | case noMatch k k' m of
110 | case (p, k) < (p', k') of
112 | link k p x k' t Nil
114 | link k' p' x' k (Tip k p x) (merge m l r)
116 | case (p, k) < (p', k') of
120 | Bin k p x m (unsafeInsertNew k' p' x' l) r
122 | Bin k p x m l (unsafeInsertNew k' p' x' r)
126 | Bin k' p' x' m (unsafeInsertNew k p x l) r
128 | Bin k' p' x' m l (unsafeInsertNew k p x r)
171 | size (Bin _ _ _ _ l r) =
172 | 1 + size l + size r
187 | go (Tip k' p' x') =
193 | go (Bin k' p' x' m l r) =
194 | case noMatch key k' m of
227 | findMin : NatPSQ p v
228 | -> Maybe (Nat, p, v)
231 | findMin (Tip k p x) =
233 | findMin (Bin k p x _ _ _) =
247 | -> Maybe (p, v, NatPSQ p v)
252 | (t', Just (p, x)) =>
255 | delFrom : NatPSQ p v
256 | -> (NatPSQ p v, Maybe (p, v))
259 | delFrom (Tip k' p' x') =
262 | (Nil, Just (p', x'))
265 | delFrom (Bin k' p' x' m l r) =
266 | case noMatch k k' m of
272 | let t' = merge m l r
273 | in (t', Just (p', x'))
277 | let (l', mbpx) = delFrom l
278 | t' = bin k' p' x' m l' r
281 | let (r', mbpx) = delFrom r
282 | t' = bin k' p' x' m l r'
294 | -> (Maybe (p, v), NatPSQ p v)
295 | insertView k p x t =
296 | case deleteView k t of
298 | (Nothing, unsafeInsertNew k p x t)
299 | Just (p', v', t') =>
300 | (Just (p', v'), unsafeInsertNew k p x t')
307 | -> Maybe (Nat, p, v, NatPSQ p v)
310 | minView (Tip k p x) =
311 | Just (k, p, x, Nil)
312 | minView (Bin k p x m l r) =
313 | Just (k, p, x, merge m l r)
322 | -> (List (Nat, p, v), NatPSQ p v)
326 | go : List (Key, p, v)
328 | -> (List (Key, p, v), NatPSQ p v)
331 | go acc (Tip k p x) =
336 | ((k, p, x) :: acc, Nil)
337 | go acc (Bin k p x m l r) =
342 | let (acc', l') = go acc l
343 | (acc'', r') = go acc' r
344 | in ((k, p, x) :: acc'', merge m l' r')
373 | Bin k' p' x' m l r =>
374 | case noMatch key k' m of
384 | bin k' p' x' m (go l) r
386 | bin k' p' x' m l (go r)
399 | Just (_, _, _, t') =>
417 | unsafeInsertNew k p x (delete k t)
430 | => (Maybe (p, v) -> (b, Maybe (p, v)))
435 | let (t', mbx) = case deleteView k t of
438 | Just (p, v, t'') =>
445 | let t'' = unsafeInsertNew k p v t'
454 | => (Maybe (Nat, p, v) -> (b, Maybe (Nat, p, v)))
461 | (b, Just (k', p', x')) =>
463 | alterMin f (Tip k p x) =
464 | case f (Just (k, p, x)) of
467 | (b, Just (k', p', x')) =>
469 | alterMin f (Bin k p x m l r) =
470 | case f (Just (k, p, x)) of
473 | (b, Just (k', p', x')) =>
476 | (b, insert k' p' x' (merge m l r))
480 | (b, Bin k p' x' m l r)
482 | (b, unsafeInsertNew k p' x' (merge m l r))
495 | map f (Tip k p x) =
497 | map f (Bin k p x m l r) =
498 | Bin k p (f x) m (map f l) (map f r)
507 | unsafeMapMonotonic : (Key -> p -> v -> (q, w))
510 | unsafeMapMonotonic f Nil =
512 | unsafeMapMonotonic f (Tip k p x) =
513 | let (p', x') = f k p x
515 | unsafeMapMonotonic f (Bin k p x m l r) =
516 | let (p', x') = f k p x
517 | in Bin k p' x' m (unsafeMapMonotonic f l) (unsafeMapMonotonic f r)
522 | fold : (Nat -> p -> v -> a -> a)
528 | fold f acc (Tip k' p' x') =
530 | fold f acc (Bin k' p' x' m l r) =
531 | let acc1 = f k' p' x' acc
532 | acc2 = fold f acc1 l
533 | acc3 = fold f acc2 r
537 | foldl : (acc -> v -> acc)
543 | foldl f acc (Tip _ _ v) =
545 | foldl f acc (Bin _ _ v _ l r) =
546 | foldl f (foldl f (f acc v) l) r
549 | foldr : (v -> acc -> acc)
555 | foldr f acc (Tip _ _ v) =
557 | foldr f acc (Bin _ _ v _ l r) =
558 | foldr f (f v (foldr f acc r)) l
570 | => List (Nat, p, v)
573 | foldl (\im, (k, p, x) => insert k p x im) empty
578 | toList : NatPSQ p v
579 | -> List (Nat, p, v)
582 | toList (Tip k p v) =
584 | toList (Bin k p v _ l r) =
585 | (k, p, v) :: toList l ++ toList r
592 | [k | (k, _, _) <- toList t]
599 | Functor (NatPSQ p) where
600 | map = Data.NatPSQ.map
603 | Foldable (NatPSQ p) where
604 | foldl = Data.NatPSQ.foldl
605 | foldr = Data.NatPSQ.foldr
606 | null = Data.NatPSQ.null