h*G>      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~0.1.1.0 Safe-Inferred"dotparseA parsing error.dotparse:A precisely known error, like leaving out "in" from "let".dotparseAn imprecise error, when we expect a number of different things, but parse something else.dotparseConsume whitespace.dotparse*Consume whitespace after running a parser.dotparseParse a line comment.dotparse-Parse a potentially nested multiline comment.dotparse7Parse a HTML-Like string by counting the angle bracketsdotparse$First character of a dot identifier. dotparsecharacter of a dot identifier. dotparse+Read a starting character of an identifier. dotparse/Read a non-starting character of an identifier. dotparseParse a non-keyword string. dotparseParse a keyword string.dotparse>> runParser quoted (strToUtf8 ""hello"") OK "hello" ""+runParser quoted (strToUtf8 "\"hello/\"\"")OK "hello\"" ""%dotparseoptional separators&dotparseparse wrapping square brackets'dotparseprint wrapping square brackets(dotparseprint wrapping quotes)dotparseparse wrapping square brackets*dotparseprint wrapping curly brackets+dotparsecomma separated Point,dotparse 3http://www.graphviz.org/docs/attr-types/splineType/-dotparse)comma separated rectangle or bounding box.dotparse true | false/dotparseNonEmpty version of many%   !"#$%&')*(+,-./%   !"#$%&')*(+,-./ Safe-Inferred",:>3dotparse7Various configutaion parameters for the chart-svg Chart@dotparse;typical edge information after processing a dot bytestring.Edotparse;typical node information after processing a dot bytestring.JdotparseA subgraph statement.+Note: each subgraph must have a unique name0runDotParser "subgraph A {A, B, C}" :: StatementStatementSubGraph (SubGraphStatement {subgraphID = Just (ID "A"), subgraphStatements = [StatementNode (NodeStatement {nodeID = ID "A", port = Nothing, nodeAttrs = fromList []}),StatementNode (NodeStatement {nodeID = ID "B", port = Nothing, nodeAttrs = fromList []}),StatementNode (NodeStatement {nodeID = ID "C", port = Nothing, nodeAttrs = fromList []})]})NdotparseEdge statement=runDotParser "A -> B [style=dashed, color=grey]" :: StatementStatementEdge (EdgeStatement {edgeOp = EdgeDirected, leftEdge = EdgeID (ID "A") Nothing, rightEdges = EdgeID (ID "B") Nothing :| [], edgeAttrs = fromList [(ID "color",ID "grey"),(ID "style",ID "dashed")]})Tdotparse?An edgeop is -> in directed graphs and -- in undirected graphs.Wdotparse8An edge can be specified in as a NodeID or as a SubGraphZdotparseNode statement9runDotParser "A [shape=diamond; color=blue]" :: StatementStatementNode (NodeStatement {nodeID = ID "A", port = Nothing, nodeAttrs = fromList [(ID "color",ID "blue"),(ID "shape",ID "diamond")]})_dotparseTop-level attribute statementrunDotParser "graph [overlap=false, splines=spline, size=\"1!\"];" :: StatementStatementAttribute (AttributeStatement {attributeType = GraphType, attributes = fromList [(ID "overlap",ID "false"),(ID "size",IDQuoted "1!"),(ID "splines",ID "spline")]})cdotparseCategory of attributegdotparseA top-level attribute*runDotParser "rankdir=\"BT\"" :: StatementStatementGlobalAttribute (GlobalAttributeStatement {globalAttributeStatement = (ID "rankdir",IDQuoted "BT")})jdotparsePort instructions which are optionally associated with an identifiermdotparseCompass instructions which are optionally associated with an identifierxdotparse2Identifier as per the dot language specifications.runDotParser "0" :: IDIDInt 0runDotParser "-.123" :: IDIDDouble (-0.123)0runParser dotParse "apple_1'" :: Result Error IDOK (ID "apple_1") "'":set -XQuasiQuotes1runParser dotParse "\"hello\"" :: Result Error IDOK (IDQuoted "hello") ""runDotParser "foo,
the bar and
the baz>" :: IDIDHtml "foo,
the bar and
the baz>"'runDotParser "shape=diamond" :: (ID,ID)(ID "shape",ID "diamond"),runDotParser "fontname=\"Arial\"" :: (ID,ID) (ID "fontname",IDQuoted "Arial")runDotParser "[shape=diamond; color=blue] [label=label]" :: Map.Map ID IDfromList [(ID "color",ID "blue"),(ID "label",ID "label"),(ID "shape",ID "diamond")]~dotparse6A dot statement as per the dot language specification.dotparseDirected (digraph | graph)dotparseMergeEdges (strict)dotparseRepresentation of a full graphviz graph, as per the dot language specificationdotparseA parser & printer class for a graphviz graph and components of its dot languagedotparse!printing options, for separators.dotparsedefault separatorsdotparsedotParse and then dotPrint:!pretty printing error on failure.This is not an exact parser/printer, so the test re-parses the dotPrint, which should be idempotentdotparse1run a dotParse erroring on leftovers, Fail or Errdotparse graph of size 1.:BS.putStr $ dotPrint defaultDotConfig defaultGraph <> "\n" digraph {" node [height=0.5;shape=circle]2 graph [overlap=false;size="1!";splines=spline] edge [arrowsize=0.5] rankdir="TB" }dotparseglobal attributes lensdotparseattributes lensdotparseDefault Strict is NoMergeEdgesdotparseDefault Directed is Directeddotparse!ID as the equivalent plain String9note that the dot language identifier equivalence law is: x == y if label x == label ydotparse+generate an EdgeOp given the type of graph.dotparse#The edge ID or subgraph ID (if any)dotparseedge IDsdotparselist of edges in a given EdgeStatement, including anonymous SugGraphsdotparseadd a graphviz statement to a dotparse'add a list of graphviz statements to a dotparserun a dot string through graphviz, supplying arguments and collecting stdoutdotparserun a dot string through graphviz, collecting the augmented dot string outputdotparse(Augment a Graph via the graphviz processdotparse(Augment a Graph via the graphviz processdotparseBounding box ID lensdotparseBounding Box lens as a dotparse nodes lensdotparse/nodes lens ignoring/forgetting port informationdotparse/edges lens ignoring/forgetting port informationdotparse1edge & attribute map ignores anonymous subgraphsdotparse-A specific attribute for all nodes in a graphdotparsenode position (as a Point)dotparse Specific attribute for all edgesdotparsenode width attributesdotparseedge width attributesdotparseedge path attributesdotparse'Create a list of NodeInfo from a graph.dotparse&Create a list of EdgeInfo from a graphdotparse 0https://graphviz.org/docs/attr-types/splineType/ format of the example is end point point and then triples (5,8,11 lengths are 1, 2 and 3 cubics)dotparse8create Statements from a (no edge label) algebraic graphdotparsedefault parametersdotparse convert a * processed via the graphviz commands to a dotparse convert a * processed via the graphviz commands to a  using the default ChartConfig.dotparse/Convert an algebraic graph to a dotparse graph.dotparseConvert an algebraic graph to a dotparse graph, starting with the .dotparseAttribute collectionsA given entity can have multiple attribute lists. For simplicity, these are mconcat'ed on parsing.dotparse'Attribute key-value pair of identifiersxy{|z}mnopqrstuvwjklcedf_`baZ[\]^WXYTUVNOPQRS~JKLMghiEFIGH@ABCD3456789:;<=>?xy{|z}mnopqrstuvwjklcedf_`baZ[\]^WXYTUVNOPQRS~JKLMghiEFIGH@ABCD3456789:;<=>? Safe-Inferred"2dotparse Link valuesdotparseRelationship between a class, a sub-component and the class of the sub-component.dotparse6A Haskell class and (informal) list of sub-components.dotparsealgebraic graph verticesdotparseConvert sub-components to a list of class, subcomponent bytestring tuples.dotparsealgebraic graph edgesdotparsealgebraic graphdotparseCreate a list of  from a list of sdotparse0Convert an algebraic Graph into dot record nodesdotparse)Convert an algebraic Graph into dot edgesdotparse8create Statements from a (edge labelled) algebraic graph 5https://graphviz.org/Gallery/directed/datastruct.htmldotparseConvert a node ID to a label for chart-svg charts Doing this directly in dot doesn't quite work because the engines get the width of the link wrong.dotparseAST  gAST = dotAST allSC componentEdges C.writeFile "other/ast.dot" $ dotPrint defaultDotConfig gAST bsSvg <- processDotWith Directed ["-Tsvg"] (dotPrint defaultDotConfig gAST) C.writeFile "other/ast.svg" bsSvgdotparseList of link valuesdotparse!list of chart-svg component edgesdotparselist of chart-svg subcomponents Safe-Inferred3xy{|z}mnopqrstuvwjklcedf_`baZ[\]^WXYTUVNOPQRS~JKLM3456789:;<=>?xy{|z}mnopqrstuvwjklcedf_`baZ[\]^WXYTUVNOPQRS~JKLM3456789:;<=>? Safe-Inferred"8H dotparseA class dependency.dotparse,Names of the various classes used in numhaskdotparse&List of all dependencies (as at v0.12)dotparse"List of classes to use in diagram.dotparse1Names of the modules where each class is located.dotparseList of dependencies to draw.dotparse%NumHask Classes as an algebraic graphdotparseConvert a node ID to a label for chart-svg charts Doing this directly in dot doesn't quite work because the engines get the width of the link wrong.dotparseNumHask statements in a dot Graph with box shapes for the nodes. g <- processGraph (dotGraphNH Directed) writeChartOptions "other/nh.svg" (graphToChartWith (defaultChartConfig & set #chartVshift (-4) & set #textSize 12) toLinkNH g) other/nh.svgNumHask Example44 Safe-Inferred">dotparseminimal definitionrunDotParser ex0 :: GraphGraph {strict = Last {getLast = Just NoMergeEdges}, directed = Last {getLast = Just UnDirected}, graphid = Last {getLast = Nothing}, nodeAttributes = fromList [], graphAttributes = fromList [], edgeAttributes = fromList [], globalAttributes = fromList [], nodes = [], edges = [], subgraphs = []}9testDotParser (Proxy :: Proxy Graph) defaultDotConfig ex0dotparse other/ex1.svgExampledotparse other/ex2.svgExampledotparse other/ex3.svgExampledotparse other/ex4.svgExampledotparse other/ex5.svgExampledotparse other/ex6.svgExampledotparse other/ex7.svgExampledotparse other/ex8.svgExampledotparse other/ex9.svgExampledotparse other/ex10.svgExampledotparse other/ex11.svgExampledotparse other/ex12.svgExampledotparse other/ex13.svgExampledotparse other/ex14.svgExampledotparse other/ex15.svgExampledotparseTest all the examplesdotparseRender all the examplesdotparsealgebraic graph example exGraph = defaultGraph & addStatements (toStatements Directed (Char8.pack . show <$> exAGraph)) exGraphAugmented <- processGraph exGraph writeChartOptions "other/exga.svg" (graphToChart exGraphAugmented) other/exga.svgaugmentation example      !""#$%&'()*+,-./0123456789:;;<=>?@ABCDEFGGHIJKKLMNOOPQRRSTUVWXYZZ[\\]^_``abcdefgghiijklmnopqrstuvvwxyz{|}~'dotparse-0.1.1.0-7ksB5EWrjOr2Em2eE9iYUkDotParse.FlatParse.THDotParse.FlatParseDotParseDotParse.TypesDotParse.Examples.ASTDotParse.Examples.NumHaskDotParse.ExamplesdotparseErrorPrecise Imprecisewstoken lineCommentmultilineCommenthtmlLikeisValidStartChar isValidCharidentStartChar identCharsymbolkeywordsymbol'keyword'identident'errorPosmerge prettyErrorcutcut' $fEqError $fShowErrorSpline splineEnd splineStartsplineP1 splineTriples testParser runParser_intdoublesignedquotedsepP wrapSquarePwrapSquarePrintwrapQuotePrint wrapCurlyPwrapCurlyPrintpointPsplinePrectPboolP nonEmptyP $fEqSpline $fShowSpline$fGenericSpline ChartConfig chartHeight chartScaleedgeSizenodeBorderSize chartColorchartBackgroundColorbackupNodeHeightbackupNodeWidth chartVshifttextSize escapeTextEdgeInfoelabelewidthcurveNodeInfonlabelnwidthposSubGraphStatement subgraphIDsubgraphStatements EdgeStatementedgeOpleftEdge rightEdges edgeAttrsEdgeOp EdgeDirectedEdgeUndirectedEdgeID EdgeSubGraph NodeStatementnodeIDport nodeAttrsAttributeStatement attributeType attributes AttributeType GraphTypeNodeTypeEdgeTypeGlobalAttributeStatementglobalAttributeStatementPortportIDCompassCompassN CompassNECompassE CompassSECompassS CompassSWCompassW CompassNWCompassCCompass_IDIDIntIDDoubleIDQuotedIDHtml Statement StatementNode StatementEdgeStatementGlobalAttributeStatementAttributeStatementSubGraphDirected UnDirectedStrict MergeEdges NoMergeEdgesGraphstrictdirectedgraphidnodeAttributesgraphAttributesedgeAttributesglobalAttributesnodesedges subgraphsdotPrintdotParse DotConfig topLevelSep statementSepattSep subGraphSepdefaultDotConfig testDotParser runDotParser defaultGraphgattLattL defStrict defDirectedlabel fromDirectededgeID edgeIDsNamededgeIDs addStatement addStatementsprocessDotWith processDotprocessGraphWith processGraphbbL nodesPortLnodesLedgesLnodesAnodePosedgesA nodeWidth edgeWidth edgeSplinenodeInfoedgeInfo splinePath toStatementsdefaultChartConfiggraphToChartWith graphToCharttoDotGraphWith toDotGraph$fDotParseRect$fDotParsePoint$fDotParseStrict$fDotParseDirected $fDotParseMap $fDotParse(,) $fDotParseID$fDotParseCompass$fDotParsePort"$fDotParseGlobalAttributeStatement$fDotParseAttributeType$fDotParseAttributeStatement$fDotParseNodeStatement$fDotParseEdgeOp$fDotParseSubGraphStatement$fDotParseEdgeStatement$fDotParseEdgeID$fDotParseStatement$fDotParseGraph $fMonoidGraph$fSemigroupGraph$fGenericChartConfig$fShowChartConfig$fEqChartConfig $fEqEdgeInfo$fShowEdgeInfo$fGenericEdgeInfo $fEqNodeInfo$fShowNodeInfo$fGenericNodeInfo $fEqGraph $fShowGraph$fGenericGraph$fEqSubGraphStatement$fShowSubGraphStatement$fGenericSubGraphStatement $fEqStatement$fShowStatement$fGenericStatement$fEqEdgeStatement$fShowEdgeStatement$fGenericEdgeStatement $fEqEdgeID $fShowEdgeID$fGenericEdgeID $fEqEdgeOp $fShowEdgeOp$fGenericEdgeOp$fEqNodeStatement$fShowNodeStatement$fGenericNodeStatement$fEqAttributeStatement$fShowAttributeStatement$fGenericAttributeStatement$fEqAttributeType$fShowAttributeType$fGenericAttributeType$fEqGlobalAttributeStatement$fShowGlobalAttributeStatement!$fGenericGlobalAttributeStatement$fEqPort $fShowPort $fGenericPort $fEqCompass $fShowCompass$fGenericCompass$fEqID$fShowID $fGenericID$fOrdID $fEqDirected$fShowDirected$fGenericDirected $fEqStrict $fShowStrict$fGenericStrict $fEqDotConfig$fShowDotConfig$fGenericDotConfig ItemModuleitem itemModule itemPackage ComponentEdgeedgeClassComponentedgeSubComponentsubComponentClass edgeLabel SubComponentsclassComponent subComponentsgraphVssubsgraphEsgraphASTfromCEs recordNodes recordEdgestoStatementsRecordtoURLdotAST itemModulescomponentEdgesallSC$fEqItemModule$fShowItemModule$fGenericItemModule$fEqComponentEdge$fShowComponentEdge$fOrdComponentEdge$fGenericComponentEdge$fEqSubComponents$fShowSubComponents$fOrdSubComponents$fGenericSubComponents Dependency_class_depClassMagmaUnital Associative Commutative Invertible Idempotent AbsorbingGroup AbelianGroupAdditive SubtractiveMultiplicativeDivisive DistributiveSemiringRingIntegralDomain SemiFieldFieldExpField QuotientFieldUpperBoundedFieldLowerBoundedField TrigFieldAdditiveActionSubtractiveActionMultiplicativeActionDivisiveActionActionsJoinSemiLatticeMeetSemiLatticeLatticeBoundedJoinSemiLatticeBoundedMeetSemiLatticeBoundedLatticeIntegralRatioBasis DirectionEpsilon dependencies classesNH classesModuledependenciesNHgraphNHGtoLinkNH dotGraphNH$fShowDependency$fEqDependency$fOrdDependency $fShowClass $fEqClass $fOrdClassex0ex1ex2ex3ex4ex5ex6ex7ex8ex9ex10ex11ex12ex13ex14ex15testAllsvgAllexAGraph*bytestring-0.12.1.0-7mxHsd9tX2kI40YX6YZhgSData.ByteString.Internal.Type ByteStringbb_-numhask-space-0.11.1.0-4QHDyODxipDL06kb2HzrZTNumHask.Space.RectRect getEdges_(chart-svg-0.7.0.0-9rGiSzvD39aDGc7AsgDxUv Chart.Markup ChartOptions