0 | module Data.Graph.Indexed.Util.DisjointSet
3 | import Data.SortedMap
4 | import Data.Linear.Token
9 | data DSNode : Nat -> Type where
10 | R : (size : Nat) -> DSNode k
11 | N : (parent : Fin k) -> DSNode k
20 | record DisjointSet (s : Type) (k : Nat) where
22 | arr : MArray s k (DSNode k)
27 | ds : (k : Nat) -> F1 s (DisjointSet s k)
28 | ds k t = let m # t := marray1 k (R 1) t in DSF m # t
30 | dspair : DisjointSet s k -> Fin k -> F1 s (Fin k,Nat)
32 | case get ds.arr x t of
33 | R s # t => (x,s) # t
35 | let r # t := dspair ds (assert_smaller x p) t
36 | _ # t := set ds.arr x (N $
fst r) t
42 | root : DisjointSet s k -> (x : Fin k) -> F1 s (Fin k)
43 | root ds x t = let p # t := dspair ds x t in fst p # t
47 | size : DisjointSet s k -> (x : Fin k) -> F1 s Nat
48 | size ds x t = let p # t := dspair ds x t in snd p # t
53 | samePartition : DisjointSet s k -> (x,y : Fin k) -> F1 s Bool
54 | samePartition ds x y t =
55 | let rx # t := root ds x t
56 | ry # t := root ds y t
61 | union : DisjointSet s k -> (x,y : Fin k) -> F1' s
62 | union ds x y = T1.do
63 | (rx,sx) <- dspair ds x
64 | (ry,sy) <- dspair ds y
67 | False => case sx > sy of
68 | True => set ds.arr rx (R $
sx + sy) >> set ds.arr ry (N rx)
69 | False => set ds.arr ry (R $
sx + sy) >> set ds.arr rx (N ry)
72 | sets : {k : _} -> DisjointSet s k -> F1 s (List $
List (Fin k))
73 | sets ds = go empty k
76 | SortedMap (Fin k) (List $
Fin k)
78 | -> {auto 0 lte : LTE n k}
79 | -> F1 s (List $
List (Fin k))
80 | go m 0 t = values m # t
82 | let x := natToFinLT j
83 | r # t := root ds x t
84 | in go (update (Just . maybe [x] (x::)) r m) j t