h$V K      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~None +xdotparseA parsing error.ydotparse:A precisely known error, like leaving out "in" from "let".zdotparseAn 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 (packUTF8 ""hello"") OK "hello" ""*runParser quoted (packUTF8 "\"hello/\"\"")OK "hello\"" ""dotparseoptional separatorsdotparseparse wrapping square bracketsdotparseprint wrapping square bracketsdotparseprint wrapping quotesdotparseparse wrapping square bracketsdotparseprint wrapping curly bracketsdotparsecomma separated Pointdotparse 3http://www.graphviz.org/docs/attr-types/splineType/dotparse)comma separated rectangle or bounding boxdotparse true | falsedotparseNonEmpty version of many%xyz{|%xyz{|None +8<=>?.;dotparse7Various configutaion parameters for the chart-svg Chartdotparse;typical edge information after processing a dot bytestring.dotparse;typical node information after processing a dot bytestring.dotparseA 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 []})]})dotparseEdge 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")]})dotparse?An edgeop is -> in directed graphs and -- in undirected graphs.dotparse8An edge can be specified in as a NodeID or as a SubGraphdotparseNode 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")]})dotparseCategory of attributedotparsePort instructions which are optionally associated with an identifierdotparseCompass instructions which are optionally associated with an identifierdotparse2Identifier 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>"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 Errdotparseglobal 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 dotparseA default dot graph+import qualified Data.ByteString.Char8 as B3B.putStrLn $ dotPrint defaultDotConfig defaultGraph digraph {" node [height=0.5;shape=circle]2 graph [overlap=false;size="1!";splines=spline] edge [arrowsize=0] }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 lens as a dotparse nodes lensdotparse/nodes lens ignoring/forgetting port informationdotparse/edges lens ignoring/forgetting port informationdotparse-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  import Chart import DotParse.Examples (exInt)ex <- processGraph exIntwriteChartSvg "other/ex.svg" (graphToChartWith defaultChartConfig ex) other/ex.svgExampledotparse 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 collectionsrunDotParser "[shape=diamond; color=blue] [label=label]" :: Map.Map ID IDfromList [(ID "color",ID "blue"),(ID "label",ID "label"),(ID "shape",ID "diamond")]A given entity can have multiple attribute lists. For simplicity, these are mconcat'ed on parsing.dotparse'Attribute key-value pair of identifiers'runDotParser "shape=diamond" :: (ID,ID)(ID "shape",ID "diamond"),runDotParser "fontname=\"Arial\"" :: (ID,ID) (ID "fontname",IDQuoted "Arial")xyzxyzNone+?0p  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgjihnklmopqrsutwvxyz{|  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgjihnklmopqrsutwvNone +?5dotparse%NumHask Classes as an algebraic graphdotparseNumHask statements in a dot Graph with box shapes for the nodes.dotparse( after being positionally processed via dotparse1Convert a node ID to a label for chart-svg chartsDoing this directly in dot doesn't quite work because the engines get the width of the link wrong.dotparse"A chart-svg chart with label links writeChartSvg "other/nh.svg" (graphToChart toLink (dotGraphNH' Directed)) other/nh.svgNumHask Example<<None  +8?Jdotparseminimal 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 ex0dotparseExamples from >https://renenyffenegger.ch/notes/tools/Graphviz/examples/index9testDotParser (Proxy :: Proxy Graph) defaultDotConfig ex1 other/ex1.svgExampledotparse9testDotParser (Proxy :: Proxy Graph) defaultDotConfig ex2 other/ex2.svgExampledotparse9testDotParser (Proxy :: Proxy Graph) defaultDotConfig ex3 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 exampledotparse exInt = defaultGraph & addStatements (toStatements Directed (packUTF8 . show <$> exGInt)) import qualified Data.ByteString.Char8 as B g <- processGraph exInt B.putStrLn $ dotPrint gdigraph { graph [bb="0,0,495.65,493.78";overlap=false;size="1!";splines=spline] node [height=0.5;label="N";shape=circle] edge [arrowsize=0] 0 [pos="384.5,475.78";width=0.5] 1 [pos="357.5,401.63";width=0.5] 0 -> 1 [pos="e,363.57,418.85 378.51,458.77 374.1,446.99 368.12,431.02 363.67,419.13"] 6 [pos="411.5,401.63";width=0.5] 0 -> 6 [pos="e,405.43,418.85 390.49,458.77 394.9,446.99 400.87,431.02 405.32,419.13"] 12 [height=0.55967;pos="467.5,401.63";width=0.55967] 0 -> 12 [pos="e,452.8,415.41 397.83,463.19 412.75,450.22 436.85,429.27 452.43,415.73"] 2 [pos="330.5,325.33";width=0.5] 1 -> 2 [pos="e,336.35,342.42 351.64,384.51 347.15,372.14 340.97,355.15 336.45,342.72"] 7 [pos="384.5,325.33";width=0.5] 1 -> 7 [pos="e,378.65,342.42 363.36,384.51 367.85,372.14 374.03,355.15 378.54,342.72"] 13 [height=0.55967;pos="440.5,325.33";width=0.55967] 1 -> 13 [pos="e,425.95,339.36 370.47,389.02 385.4,375.66 409.87,353.75 425.58,339.69"] 3 [pos="263.5,249.04";width=0.5] 2 -> 3 [pos="e,275.26,263.08 318.83,311.39 306.7,297.94 287.81,277 275.55,263.4"] 8 [pos="419.5,249.04";width=0.5] 2 -> 8 [pos="e,406.15,261.18 344.02,313.05 360.71,299.11 388.95,275.54 405.75,261.51"] 14 [height=0.55967;pos="475.5,249.04";width=0.55967] 2 -> 14 [pos="e,459.28,261.56 344.39,313.55 348.48,310.63 353.06,307.61 357.5,305.19 394.93,284.71 408.73,289.04 446.5,269.19 450.64,267.01 454.93, 264.4 458.9,261.81"] 18 [height=0.55967;pos="239.5,96.445";width=0.55967] 2 -> 18 [pos="e,221.18,105.3 313.92,317.87 277.75,302.66 192.9,260.73 166.5,192.89 160,176.2 158.52,168.63 166.5,152.59 177.74,130.02 203.11,114.24 220.76,105.5"] 19 [height=0.55967;pos="335.5,96.445";width=0.55967] 2 -> 19 [pos="e,335.94,116.84 331.52,307.33 332.98,282.28 335.56,234 336.5,192.89 336.91,174.98 336.66,170.5 336.5,152.59 336.39,140.81 336.16, 127.62 335.94,117.09"] 4 [pos="101.5,172.74";width=0.5] 3 -> 4 [pos="e,117.56,181.11 247.37,240.64 216.44,226.46 149.09,195.57 117.92,181.27"] 9 [pos="193.5,172.74";width=0.5] 3 -> 9 [pos="e,205.67,186.66 251.62,235.43 238.93,221.96 218.89,200.69 205.97,186.98"] 15 [height=0.55967;pos="287.5,172.74";width=0.55967] 3 -> 15 [pos="e,281.6,192.01 268.82,231.55 272.58,219.93 277.61,204.35 281.51,192.29"] 5 [pos="48.498,96.445";width=0.5] 4 -> 5 [pos="e,58.506,111.47 91.279,157.42 81.908,144.28 68.101,124.92 58.727,111.78"] 10 [height=0.55967;pos="104.5,96.445";width=0.55967] 4 -> 10 [pos="e,103.72,116.67 102.19,154.51 102.65,143.28 103.24,128.61 103.71,116.95"] 16 [height=0.55967;pos="162.5,96.445";width=0.55967] 4 -> 16 [pos="e,150.12,112.52 112.69,158.11 123.2,145.31 138.91,126.18 149.86,112.83"] 5 -> 0 [pos="e,366.23,475.02 49.439,114.6 50.887,142.55 53.498,199.64 53.498,248.04 53.498,326.33 53.498,326.33 53.498,326.33 53.498,464.3 295.89, 474.85 365.82,475.02"] 11 [height=0.54162;pos="19.498,20.148";width=0.54162] 5 -> 11 [pos="e,26.284,38.534 42.206,79.323 37.545,67.382 31.197,51.119 26.397,38.823"] 17 [height=0.55967;pos="77.498,20.148";width=0.55967] 5 -> 17 [pos="e,70.506,39.061 54.791,79.323 59.386,67.552 65.62,51.579 70.394,39.349"] 15 -> 18 [pos="e,250.12,113.89 276.85,155.25 268.95,143.04 258.24,126.45 250.31,114.18"] 15 -> 19 [pos="e,324.88,113.89 298.15,155.25 306.04,143.04 316.76,126.45 324.69,114.18"] 18 -> 3 [pos="e,260.79,231.06 242.53,116.49 247.24,145.99 256.21,202.31 260.74,230.72"] 19 -> 3 [pos="e,277.53,237.38 334.82,116.79 333.41,136.85 329.16,168.62 316.5,192.89 307.11,210.88 290.05,227.04 277.82,237.15"] }      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrrstuvwxwywzw{w|w}w}w~w~%dotparse-0.0.1-5AVQHYUVJvmJG4Wti4lWeqDotParseDotParse.FlatParse.THDotParse.FlatParseDotParse.TypesDotParse.Examples.NumHaskDotParse.Examples(flatparse-0.3.3.0-DU6w7lbETga6qjqbsCBDnVFlatParse.Basic anyInt64be anyInt64le anyInt32be anyInt32le anyInt16be anyInt16le anyWord64be anyWord64le anyWord32be anyWord32le anyWord16be anyWord16leanyIntanyInt64anyInt32anyInt16anyInt8anyWord_anyWord anyWord64_ anyWord64 anyWord32_ anyWord32 anyWord16_ anyWord16 anyWord8_anyWord8 withAnyInt64# withAnyInt32# withAnyInt16# withAnyInt8#withAnyWord64#withAnyWord32#withAnyWord16# withAnyWord8# scanBytes#setBack# scanAny8#scan64#scan32#scan16#scan8# ensureBytes# unpackUTF8 traceResttakeRest traceLinetakeLinemkPosunsafeSpanToByteString posLineColsvalidPosinSpan byteStringed byteStringOfspannedspanOfendPossetPosgetPos notFollowedBysome_somemany_manychainrchainlbranch<|> readIntegerreadInt anyCharASCII_ anyCharASCIIanyChar_anyChar fusedSatisfy_ fusedSatisfy satisfyASCII_ satisfyASCIIsatisfy_satisfyrawSwitchWithPostswitchWithPostswitchstringbytesbytechareofcuttingoptioned optional_optionaltryfails lookaheaderrempty runParserS runParserOK#Err#Fail#Res# runParser#ParserErrFailOKResultFlatParse.InternalpackUTF8 unsafeSlice isGreekLetter isLatinLetterisDigitPosSpanErrorPrecise Imprecisewstoken lineCommentmultilineCommenthtmlLikeisValidStartChar isValidCharidentStartChar identCharsymbolkeywordsymbol'keyword'identident'errorPosmerge prettyErrorcutcut' $fEqError $fShowErrorSpline splineEnd splineStartsplineP1 splineTriples testParser runParser_intdoublesignedquotedsepP wrapSquarePwrapSquarePrintwrapQuotePrint wrapCurlyPwrapCurlyPrintpointPsplinePrectPboolP nonEmptyP $fEqSpline $fShowSpline$fGenericSpline ChartConfig chartHeight chartScaleedgeSize chartColorchartBackgroundColor nodeHeightnodeSizevshifttextSizelabelfEdgeInfoelabelewidthcurveNodeInfonlabelnwidthposSubGraphStatement subgraphIDsubgraphStatements EdgeStatementedgeOpleftEdge rightEdges edgeAttrsEdgeOp EdgeDirectedEdgeUndirectedEdgeID EdgeSubGraph NodeStatementnodeIDport nodeAttrsAttributeStatement attributeType attributes AttributeType GraphTypeNodeTypeEdgeTypePortportIDCompassCompassN CompassNECompassE CompassSECompassS CompassSWCompassW CompassNWCompassCCompass_IDIDIntIDDoubleIDQuotedIDHtml Statement StatementNode StatementEdgeStatementGlobalAttributeStatementAttributeStatementSubGraphDirected UnDirectedStrict MergeEdges NoMergeEdgesGraphstrictdirectedgraphidnodeAttributesgraphAttributesedgeAttributesglobalAttributesnodesedges subgraphsdotPrintdotParse DotConfig topLevelSep statementSepattSep subGraphSepdefaultDotConfig testDotParser runDotParsergattLattL defStrict defDirectedlabel fromDirectededgeID edgeIDsNamededgeIDs addStatement addStatements defaultGraphprocessDotWith 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 $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 Dependency_class_dep_opFamilyAdditionMultiplicationActorClassMagmaUnital Associative Commutative Invertible Idempotent AbsorbingGroup AbelianGroupAdditive SubtractiveMultiplicativeDivisive DistributiveSemiringRingIntegralDomainFieldExpField QuotientFieldUpperBoundedFieldLowerBoundedField TrigFieldAdditiveActionSubtractiveActionMultiplicativeActionDivisiveActionModuleJoinSemiLatticeMeetSemiLatticeLatticeBoundedJoinSemiLatticeBoundedMeetSemiLatticeBoundedLatticeIntegralRatioSignedNormBasis DirectionEpsilon dependencies classesNH classesModuledependenciesNHgraphNHG dotGraphNH dotGraphNH'toLink writeNHChart$fShowDependency$fEqDependency$fOrdDependency $fShowFamily $fEqFamily $fOrdFamily $fShowClass $fEqClass $fOrdClassex0ex1ex2ex3ex4ex5ex6ex7ex8ex9ex10ex11ex12ex13ex14ex15testAllsvgAllexGIntexInt*bytestring-0.11.3.1-6BX4W6rzLFw9rkgS7vhQZXData.ByteString.Internal ByteString-numhask-space-0.10.0.0-6tdTZTtzXI157h00WKtdFfNumHask.Space.RectRect&chart-svg-0.3.0-1VIBMibUI1x6FKavaplTW2 Chart.SvgChartSvg1neat-interpolation-0.5.1.3-IVtrKlUMsYs2ycHFcNXeldNeatInterpolation untrimmingtrimmingtext