1 | module Data.OrdPSQ.Internal
5 | import Derive.Prelude
8 | %language ElabReflection
20 | data Elem : (k : Type) -> (p : Type) -> (v : Type) -> Type where
26 | %runElab derive "Elem" [Eq,Ord,Show]
30 | foldr : (a -> b -> b)
34 | foldr f z (MkElem _ _ v) =
38 | foldl : (b -> a -> b)
42 | foldl f z (MkElem _ _ v) =
49 | map f (MkElem k p v) =
53 | Functor (Elem k p) where
57 | Foldable (Elem k p) where
58 | foldr f z = Data.OrdPSQ.Internal.Elem.foldr f z
59 | foldl f z = Data.OrdPSQ.Internal.Elem.foldl f z
66 | data LTree : (k : Type) -> (p : Type) -> (v : Type) -> Type where
81 | %runElab derive "LTree" [Eq,Ord,Show]
85 | foldr : (a -> b -> b)
91 | foldr f z (LLoser _ e l _ r) =
92 | foldr f (Prelude.foldr f (foldr f z r) e) l
93 | foldr f z (RLoser _ e l _ r) =
94 | foldr f (Prelude.foldr f (foldr f z r) e) l
97 | foldl : (b -> a -> b)
103 | foldl f z (LLoser _ e l _ r) =
104 | foldl f (Prelude.foldl f (foldl f z l) e) r
105 | foldl f z (RLoser _ e l _ r) =
106 | foldl f (Prelude.foldl f (foldl f z l) e) r
114 | map f (LLoser s e l k r) =
115 | LLoser s (map f e) (map f l) k (map f r)
116 | map f (RLoser s e l k r) =
117 | RLoser s (map f e) (map f l) k (map f r)
120 | Functor (LTree k p) where
124 | Foldable (LTree k p) where
125 | foldr f z = Data.OrdPSQ.Internal.LTree.foldr f z
126 | foldl f z = Data.OrdPSQ.Internal.LTree.foldl f z
135 | data OrdPSQ : (k : Type) -> (p : Type) -> (v : Type) -> Type where
136 | Void : OrdPSQ k p v
137 | Winner : Elem k p v
142 | %runElab derive "OrdPSQ" [Eq,Ord,Show]
163 | beats (p, k) (p', k') =
164 | p < p' || (p == p' && k < k')
167 | size' : LTree p k v
171 | size' (LLoser s _ _ _ _) =
173 | size' (RLoser s _ _ _ _) =
180 | assert_total $
idris_crash "Data.OrdPSQ.Internal.left: empty loser tree"
181 | left (LLoser _ _ tl _ _) =
183 | left (RLoser _ _ tl _ _) =
187 | right : LTree k p v
190 | assert_total $
idris_crash "Data.OrdPSQ.Internal.right: empty loser tree"
191 | right (LLoser _ _ _ _ tr) =
193 | right (RLoser _ _ _ _ tr) =
197 | maxKey : OrdPSQ k p v
200 | assert_total $
idris_crash "Data.OrdPSQ.Internal.maxKey: empty queue"
201 | maxKey (Winner _ _ m) =
212 | lLoser k p v tl m tr =
213 | LLoser (1 + size' tl + size' tr) (MkElem k p v) tl m tr
223 | rLoser k p v tl m tr =
224 | RLoser (1 + size' tl + size' tr) (MkElem k p v) tl m tr
227 | lSingleLeft : Ord k
236 | lSingleLeft k1 p1 v1 t1 m1 (LLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
237 | case (p1, k1) `beats` (p2, k2) of
239 | lLoser k1 p1 v1 (rLoser k2 p2 v2 t1 m1 t2) m2 t3
241 | lLoser k2 p2 v2 (lLoser k1 p1 v1 t1 m1 t2) m2 t3
242 | lSingleLeft k1 p1 v1 t1 m1 (RLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
243 | rLoser k2 p2 v2 (lLoser k1 p1 v1 t1 m1 t2) m2 t3
244 | lSingleLeft _ _ _ _ _ _ =
245 | assert_total $
idris_crash "Data.OrdPSQ.Internal.lSingleLeft: malformed tree"
255 | rSingleLeft k1 p1 v1 t1 m1 (LLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
256 | rLoser k1 p1 v1 (rLoser k2 p2 v2 t1 m1 t2) m2 t3
257 | rSingleLeft k1 p1 v1 t1 m1 (RLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
258 | rLoser k2 p2 v2 (rLoser k1 p1 v1 t1 m1 t2) m2 t3
259 | rSingleLeft _ _ _ _ _ _ =
260 | assert_total $
idris_crash "Data.OrdPSQ.Internal.rSingleLeft: malformed tree"
270 | lSingleRight k1 p1 v1 (LLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
271 | lLoser k2 p2 v2 t1 m1 (lLoser k1 p1 v1 t2 m2 t3)
272 | lSingleRight k1 p1 v1 (RLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
273 | lLoser k1 p1 v1 t1 m1 (lLoser k2 p2 v2 t2 m2 t3)
274 | lSingleRight _ _ _ _ _ _ =
275 | assert_total $
idris_crash "Data.OrdPSQ.Internal.lSingleRight: malformed tree"
278 | rSingleRight : Ord k
287 | rSingleRight k1 p1 v1 (LLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
288 | lLoser k2 p2 v2 t1 m1 (rLoser k1 p1 v1 t2 m2 t3)
289 | rSingleRight k1 p1 v1 (RLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
290 | case (p1, k1) `beats` (p2, k2) of
292 | rLoser k1 p1 v1 t1 m1 (lLoser k2 p2 v2 t2 m2 t3)
294 | rLoser k2 p2 v2 t1 m1 (rLoser k1 p1 v1 t2 m2 t3)
295 | rSingleRight _ _ _ _ _ _ =
296 | assert_total $
idris_crash "Data.OrdPSQ.Internal.rSingleRight: malformed tree"
299 | lDoubleLeft : Ord k
308 | lDoubleLeft k1 p1 v1 t1 m1 (LLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
309 | lSingleLeft k1 p1 v1 t1 m1 (lSingleRight k2 p2 v2 t2 m2 t3)
310 | lDoubleLeft k1 p1 v1 t1 m1 (RLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
311 | lSingleLeft k1 p1 v1 t1 m1 (rSingleRight k2 p2 v2 t2 m2 t3)
312 | lDoubleLeft _ _ _ _ _ _ =
313 | assert_total $
idris_crash "Data.OrdPSQ.Internal.lDoubleLeft: malformed tree"
316 | lDoubleRight : Ord k
325 | lDoubleRight k1 p1 v1 (LLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
326 | lSingleRight k1 p1 v1 (lSingleLeft k2 p2 v2 t1 m1 t2) m2 t3
327 | lDoubleRight k1 p1 v1 (RLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
328 | lSingleRight k1 p1 v1 (rSingleLeft k2 p2 v2 t1 m1 t2) m2 t3
329 | lDoubleRight _ _ _ _ _ _ =
330 | assert_total $
idris_crash "Data.OrdPSQ.Internal.lDoubleRight: malformed tree"
333 | rDoubleLeft : Ord k
342 | rDoubleLeft k1 p1 v1 t1 m1 (LLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
343 | rSingleLeft k1 p1 v1 t1 m1 (lSingleRight k2 p2 v2 t2 m2 t3)
344 | rDoubleLeft k1 p1 v1 t1 m1 (RLoser _ (MkElem k2 p2 v2) t2 m2 t3) =
345 | rSingleLeft k1 p1 v1 t1 m1 (rSingleRight k2 p2 v2 t2 m2 t3)
346 | rDoubleLeft _ _ _ _ _ _ =
347 | assert_total $
idris_crash "Data.OrdPSQ.Internal.rDoubleLeft: malformed tree"
350 | rDoubleRight : Ord k
359 | rDoubleRight k1 p1 v1 (LLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
360 | rSingleRight k1 p1 v1 (lSingleLeft k2 p2 v2 t1 m1 t2) m2 t3
361 | rDoubleRight k1 p1 v1 (RLoser _ (MkElem k2 p2 v2) t1 m1 t2) m2 t3 =
362 | rSingleRight k1 p1 v1 (rSingleLeft k2 p2 v2 t1 m1 t2) m2 t3
363 | rDoubleRight _ _ _ _ _ _ =
364 | assert_total $
idris_crash "Data.OrdPSQ.Internal.rDoubleRight: malformed tree"
367 | lBalanceLeft : Ord k
376 | lBalanceLeft k p v l m r =
377 | case size' (left r) < size' (right r) of
379 | lSingleLeft k p v l m r
381 | lDoubleLeft k p v l m r
384 | lBalanceRight : Ord k
393 | lBalanceRight k p v l m r =
394 | case size' (left l) > size' (right l) of
396 | lSingleRight k p v l m r
398 | lDoubleRight k p v l m r
401 | rBalanceLeft : Ord k
410 | rBalanceLeft k p v l m r =
411 | case size' (left r) < size' (right r) of
413 | rSingleLeft k p v l m r
415 | rDoubleLeft k p v l m r
418 | rBalanceRight : Ord k
427 | rBalanceRight k p v l m r =
428 | case size' (left l) > size' (right l) of
430 | rSingleRight k p v l m r
432 | rDoubleRight k p v l m r
444 | lBalance k p v Start m r =
445 | lLoser k p v Start m r
446 | lBalance k p v l m Start =
447 | lLoser k p v l m Start
448 | lBalance k p v l m r =
449 | case size' r > omega * size' l of
451 | lBalanceLeft k p v l m r
453 | case size' l > omega * size' r of
455 | lBalanceRight k p v l m r
469 | rBalance k p v Start m r =
470 | rLoser k p v Start m r
471 | rBalance k p v l m Start =
472 | rLoser k p v l m Start
473 | rBalance k p v l m r =
474 | case size' r > omega * size' l of
476 | rBalanceLeft k p v l m r
478 | case size' l > omega * size' r of
480 | rBalanceRight k p v l m r
489 | data TourView : (k : Type) -> (p : Type) -> (v : Type) -> Type where
490 | Null : TourView k p v
491 | Single : Elem k p v
493 | Play : OrdPSQ k p v
497 | %runElab derive "TourView" [Eq,Ord,Show]
500 | tourView : OrdPSQ k p v
504 | tourView (Winner e Start _) =
506 | tourView (Winner e (RLoser _ e' tl m tr) m') =
507 | Winner e tl m `Play` Winner e' tr m'
508 | tourView (Winner e (LLoser _ e' tl m tr) m') =
509 | Winner e' tl m `Play` Winner e tr m'
524 | (Winner e@(MkElem k p v) t m) `play` (Winner e'@(MkElem k' p' v') t' m') =
525 | case (p, k) `beats` (p', k') of
527 | Winner e (rBalance k' p' v' t m t') m'
529 | Winner e' (lBalance k p v t m t') m'