@@ -2,14 +2,21 @@ module Data.GenericGraph where
2
2
3
3
import Control.Semigroupoid ((>>>))
4
4
import Data.Array (concat , foldr , (!!), (:))
5
- import Data.DotLang (Attr (..), Edge (..), EdgeType (..), FillStyle (..), Graph , Node (..), graphFromElements , changeNodeId , nodeId )
6
- import Data.Generic.Rep (class Generic , Argument (..), Constructor (..), Field (..), NoArguments , NoConstructors , Product (..), Rec (..), Sum (..), from )
5
+ import Data.DotLang (Edge (..), EdgeType (..), Graph , Node (..), graphFromElements , changeNodeId , nodeId )
6
+ import Data.DotLang.Attr (FillStyle (..))
7
+ import Data.DotLang.Attr.Edge as E
8
+ import Data.DotLang.Attr.Node as N
9
+ import Data.Generic.Rep (class Generic , Argument (..), Constructor (..), NoArguments , NoConstructors , Product (..), Sum (..), from )
7
10
import Data.Maybe (Maybe (..), fromMaybe )
8
11
import Data.String (joinWith )
9
12
import Data.Symbol (class IsSymbol , SProxy (..), reflectSymbol )
10
13
import Data.Tuple (Tuple (..), fst )
11
- import Prelude (class Show , id , show , ($), (+), (<$>), (<>))
12
-
14
+ import Prelude (class Show , identity , show , ($), (+), (<$>), (<>))
15
+ import Prim.Row (class Cons , class Lacks )
16
+ import Prim.RowList (class RowToList , Nil , Cons )
17
+ import Record as Record
18
+ import Type.Data.RowList (RLProxy (..))
19
+ import Type.RowList (class ListToRow )
13
20
14
21
-- Tree type
15
22
data Tree a = Root a (Array (Tree a ))
@@ -67,14 +74,22 @@ instance arrayEdges :: Edges a => Edges (Array a) where
67
74
instance genericReprArgument :: Edges a => GenericEdges (Argument a ) where
68
75
genericEdges' (Argument a) = edges a
69
76
77
+ class (RowToList r rl ) <= GenericEdgesRowList r rl | rl -> r where
78
+ rlEdges :: RLProxy rl -> Record r -> Array (Tree (Maybe Node ))
70
79
71
- instance genericEdgesRec :: GenericEdges a => GenericEdges ( Rec a ) where
72
- genericEdges' ( Rec a) = genericEdges' a
80
+ instance emptyRowToEdge :: ( RowToList r Nil ) => GenericEdgesRowList r Nil where
81
+ rlEdges _ _ = []
73
82
74
- instance genericEdgesField :: (Edges a , IsSymbol name ) => GenericEdges ( Field name a ) where
75
- genericEdges' ( Field a) = Root (Just $ Node fieldName [] ) [ edges a ]
83
+ instance consRowToEdge :: (Edges ty , Lacks name tailRow , GenericEdgesRowList tailRow tail , Cons name ty tailRow r , IsSymbol name , RowToList r ( Cons name ty tail )) => GenericEdgesRowList r ( Cons name ty tail ) where
84
+ rlEdges _ r = Root (Just $ Node fieldName [] ) [edges fieldValue] : rlEdges ( RLProxy :: RLProxy tail ) ( Record .delete fieldSymbol r)
76
85
where
77
- fieldName = reflectSymbol (SProxy :: SProxy name )
86
+ fieldSymbol = SProxy :: SProxy name
87
+ fieldName = reflectSymbol fieldSymbol
88
+ fieldValue :: ty
89
+ fieldValue = Record .get fieldSymbol r
90
+
91
+ instance genericEdgesRec :: (RowToList r rl , GenericEdgesRowList r rl ) => Edges (Record r ) where
92
+ edges r = Root (Just $ Node " root" [] ) (rlEdges (RLProxy :: RLProxy rl ) r)
78
93
79
94
-- | A `Generic` implementation of the `eq` member from the `Eq` type class.
80
95
genericEdges :: forall a rep . Generic a rep => GenericEdges rep => a -> Tree (Maybe Node )
@@ -101,7 +116,7 @@ uniqueNodes :: Tree Node -> Tree Node
101
116
uniqueNodes = (uniqueNodes' 0 ) >>> fst
102
117
103
118
extractEdges :: Node -> Tree Node -> Array Edge
104
- extractEdges parent (Root node children) = [Edge Forward (nodeId parent) (nodeId node)] <>
119
+ extractEdges parent (Root node children) = [Edge Forward (nodeId parent) (nodeId node) [] ] <>
105
120
(concat $
106
121
(extractEdges node) <$> children)
107
122
@@ -111,8 +126,8 @@ extractNodes (Root node children) = node : (concat $ extractNodes <$> children)
111
126
-- | genenric version of toGraph not renaming nodes.
112
127
genericToGraphUnique ∷ ∀ a . Edges a => a -> Graph
113
128
genericToGraphUnique e
114
- = id
115
- $ (\f -> graphFromElements ((Node " root" [Style Invis ]) : extractNodes f) (extractEdges (Node " root" [] ) f))
129
+ = identity
130
+ $ (\f -> graphFromElements ((Node " root" [N. Style Invis ]) : extractNodes f) (extractEdges (Node " root" [] ) f))
116
131
$ fromMaybe (Root (Node " " [] ) [] )
117
132
$ (\a -> a !! 0 )
118
133
$ eliminateNothings
@@ -121,8 +136,8 @@ genericToGraphUnique e
121
136
-- | generic version of toGraph. Renaming Nodes to make them unique
122
137
genericToGraph :: ∀ a . Edges a => a -> Graph
123
138
genericToGraph e
124
- = id
125
- $ (\f -> graphFromElements ((Node " root" [Style Invis ]) : extractNodes f) (extractEdges (Node " root" [] ) f))
139
+ = identity
140
+ $ (\f -> graphFromElements ((Node " root" [N. Style Invis ]) : extractNodes f) (extractEdges (Node " root" [] ) f))
126
141
$ uniqueNodes
127
142
$ fromMaybe (Root (Node " " [] ) [] )
128
143
$ (\a -> a !! 0 )
0 commit comments