0 | module Graphics.DOT.Interfaces
2 | import Graphics.DOT.AST
17 | interface DOTCompassPoint t where
18 | toCompassPoint : t -> CompassPoint
22 | interface DOTKeyword t where
23 | toKeyword : t -> Keyword
27 | interface DOTDOTID t where
28 | toDOTID : t -> DOTID
32 | interface DOTPort t where
37 | interface DOTNodeID t where
38 | toNodeID : t -> NodeID
42 | interface DOTAssign t where
43 | toAssign : t -> Assign
47 | interface DOTEdgeOp t where
48 | toEdgeOp : t -> EdgeOp
52 | interface DOTEdgeRHS t where
53 | toEdgeRHS : t -> EdgeRHS
57 | interface DOTSubgraph t where
58 | toSubgraph : t -> Subgraph
62 | interface DOTStmt t where
67 | interface DOTGraph t where
68 | toGraph : t -> Graph
80 | Show CompassPoint where
90 | show Underscore = "_"
94 | show StrictKW = "strict"
95 | show GraphKW = "graph"
96 | show DigraphKW = "digraph"
97 | show NodeKW = "node"
98 | show EdgeKW = "edge"
99 | show SubgraphKW = "subgraph"
103 | show (StringID id_) = show id_
104 | show (NameID name) = name
105 | show (Numeral num) = num
106 | show (HTML htmlStr) = htmlStr
110 | show (IDPort id_ Nothing) = ":" ++ show id_
111 | show (IDPort id_ (Just cpt)) = ":" ++ show id_ ++ ":" ++ show cpt
112 | show (PlainPort cpt) = ":" ++ show cpt
116 | show (MkNodeID id_ Nothing) = show id_
117 | show (MkNodeID id_ (Just port)) = show id_ ++ show port
121 | show (MkAssign lhs rhs) = show lhs ++ "=" ++ show rhs
132 | showStmtList : List Stmt -> String
133 | showStmtList stmtList = joinBy "; " (map show stmtList)
140 | showAttrList : List (List Assign) -> String
141 | showAttrList = concatMap show
146 | show (MkEdgeRHS op (Left id_)) = show op ++ " " ++ show id_
147 | show (MkEdgeRHS op (Right subGr)) = show op ++ " " ++ show subGr
151 | Show Subgraph where
152 | show (MkSubgraph Nothing stmtList) =
153 | "{ " ++ showStmtList stmtList ++ " }"
155 | show (MkSubgraph (Just (kw, Nothing)) stmtList) =
156 | show kw ++ " { " ++ showStmtList stmtList ++ " }"
158 | show (MkSubgraph (Just (kw, (Just id_))) stmtList) =
159 | show kw ++ " " ++ show id_ ++ " { " ++ showStmtList stmtList ++ " }"
164 | show (NodeStmt nodeID attrList) =
165 | show nodeID ++ " " ++ concatMap show attrList
167 | show (EdgeStmt (Left nodeID) rhs attrList) =
168 | show nodeID ++ " " ++ concatMap show rhs ++ " " ++ showAttrList attrList
169 | show (EdgeStmt (Right subGr) rhs attrList) =
170 | show subGr ++ " " ++ concatMap show rhs ++ " " ++ showAttrList attrList
172 | show (AttrStmt kw attrList) =
173 | show kw ++ " " ++ showAttrList attrList
175 | show (AssignStmt a) =
178 | show (SubgraphStmt subGr) =
184 | show (MkGraph Nothing graphTy Nothing stmtList) =
185 | show graphTy ++ " {\n" ++ showStmtList stmtList ++ "\n}"
187 | show (MkGraph Nothing graphTy (Just id_) stmtList) =
188 | show graphTy ++ " " ++ show id_ ++ " {\n" ++ showStmtList stmtList ++ "\n}"
190 | show (MkGraph (Just strict) graphTy Nothing stmtList) =
191 | show strict ++ " " ++ show graphTy
193 | ++ showStmtList stmtList
196 | show (MkGraph (Just strict) graphTy (Just id_) stmtList) =
197 | show strict ++ " " ++ show graphTy ++ " " ++ show id_
199 | ++ showStmtList stmtList
207 | Eq CompassPoint where
216 | (==) Center Center = True
217 | (==) Underscore Underscore = True
222 | (==) StrictKW StrictKW = True
223 | (==) GraphKW GraphKW = True
224 | (==) DigraphKW DigraphKW = True
225 | (==) NodeKW NodeKW = True
226 | (==) EdgeKW EdgeKW = True
227 | (==) SubgraphKW SubgraphKW = True
232 | (==) (StringID id1) (StringID id2) = id1 == id2
233 | (==) (NameID n1) (NameID n2) = n1 == n2
234 | (==) (Numeral num1) (Numeral num2) = num1 == num2
235 | (==) (HTML html1) (HTML html2) = html1 == html2
240 | (==) (IDPort id1 mCPT1) (IDPort id2 mCPT2) = mCPT1 == mCPT2 && id1 == id2
241 | (==) (PlainPort cpt1) (PlainPort cpt2) = cpt1 == cpt2
246 | (==) (MkNodeID id1 mPort1) (MkNodeID id2 mPort2) = mPort1 == mPort2 && id1 == id2
250 | (==) (MkAssign lhs1 rhs1) (MkAssign lhs2 rhs2) = lhs1 == lhs2 && rhs1 == rhs2
254 | (==) Arrow Arrow = True
255 | (==) Dash Dash = True
262 | (==) (MkEdgeRHS op1 s1) (MkEdgeRHS op2 s2) = op1 == op2 && s1 == s2
267 | (==) (MkSubgraph mSubGrID1 stmtList1) (MkSubgraph mSubGrID2 stmtList2) =
268 | mSubGrID1 == mSubGrID2 && stmtList1 == stmtList2
273 | (==) (NodeStmt nodeID1 attrList1) (NodeStmt nodeID2 attrList2) =
274 | nodeID1 == nodeID2 && attrList1 == attrList2
276 | (==) (EdgeStmt e1 rhs1 attrList1) (EdgeStmt e2 rhs2 attrList2) =
277 | e1 == e2 && rhs1 == rhs2 && attrList1 == attrList2
279 | (==) (AttrStmt kw1 attrList1) (AttrStmt kw2 attrList2) =
280 | kw1 == kw2 && attrList1 == attrList2
282 | (==) (AssignStmt a1) (AssignStmt a2) =
285 | (==) (SubgraphStmt subGr1) (SubgraphStmt subGr2) =
294 | (==) (MkGraph s1 grTy1 mID1 stmtList1) (MkGraph s2 grTy2 mID2 stmtList2) =
295 | s1 == s2 && grTy1 == grTy2 && mID1 == mID2 && stmtList1 == stmtList2