3 | module Data.Graph.Indexed.Ring.Systems
6 | import Data.Graph.Indexed
7 | import Data.Graph.Indexed.Subgraph
8 | import Data.Linear.Traverse1
19 | record RingSystems (k : Nat) (e,n : Type) where
21 | graph : IGraph k e n
23 | rings : IArray systems (Subgraph k e n)
24 | ringMap : IArray k (Fin (S systems))
28 | isInRing : RingSystems k e n -> Fin k -> Bool
30 | case rs.ringMap `at` x of
36 | inSameRing : RingSystems k e n -> (x,y : Fin k) -> Bool
37 | inSameRing rs x y = isInRing rs x && at rs.ringMap x == at rs.ringMap y
43 | ringFor : RingSystems k e n -> Fin k -> Maybe (Subgraph k e n)
45 | case rs.ringMap `at` x of
47 | FS k => Just $
rs.rings `at` k
52 | ringSystems : {k : _} -> IGraph k e n -> RingSystems k e n
54 | let bcs := biconnectedComponents g
55 | in RS g _ (arrayL bcs) (fromPairs k FZ $
zipWithIndex bcs >>= pairs)
58 | pairs : {y : _} -> (Nat,Graph e (Fin k, n)) -> List (Nat, Fin y)
60 | let Just x := tryNatToFin (S n) | Nothing => []
61 | in (\l => (finToNat $
fst l, x)) <$> labels g