0 | module Data.Graph.Indexed.Ring.Util
2 | import Data.SortedSet
3 | import Data.Graph.Indexed
10 | 0 EdgeSet : (k : Nat) -> Type
11 | EdgeSet k = SortedSet (Edge k ())
18 | addEdge : EdgeSet k -> Fin k -> Fin k -> EdgeSet k
19 | addEdge es x y = maybe es (`insert` es) (mkEdge x y ())
26 | addNatEdge : {k : _} -> EdgeSet k -> Nat -> Nat -> EdgeSet k
28 | let Just fx := tryNatToFin x | Nothing => es
29 | Just fy := tryNatToFin y | Nothing => es
35 | toEdgeSet : {k : _} -> List (Nat,Nat) -> EdgeSet k
36 | toEdgeSet = foldl (\es,(x,y) => addNatEdge es x y) empty
38 | nodePairs : SnocList (a,a) -> List a -> SnocList (a,a)
39 | nodePairs sp [] = sp
40 | nodePairs sp (h::t) = nodePairs (sp <>< map (h,) t) t
48 | inThreeMemberedRing : IGraph k e n -> Fin k -> Bool
49 | inThreeMemberedRing g x =
50 | any (\(a,b) => adjacent g a b) (nodePairs [<] (neighbours g x))