private static void AppendFunctionPipe( IGraphNodeWithOutput functionPipe, NodeMetadata metadata, List <string> result) { var inputs = functionPipe.Parents.Select(GetPredecessorOutput) .Select(metadata.GetQuotedUniqueName) .ToArray(); var function = metadata.GetQuotedUniqueName(functionPipe); var output = metadata.GetQuotedUniqueName(functionPipe.Output); var collectorNode = functionPipe.Collector; if (collectorNode != null) { var collectorUniqueName = metadata.GetQuotedUniqueName(collectorNode); output = $"{{{output}, {collectorUniqueName}}}"; } if (inputs.Count() == 1) { result.Add($"{inputs.Single()} -> {function} -> {output}\n"); } else { result.Add($"{{{string.Join(", ", inputs)}}} -> {function} -> {output}\n"); } }
private static void AppendCollectorPipeFormatting(IGraphNode node, NodeMetadata metadata, StringBuilder result) { var label = metadata.GetCount(node) == 0 ? "" : "label=Collector, "; var uniqueName = metadata.GetQuotedUniqueName(node); AppendFormat(uniqueName, $@"{label}color = ""#c361f4""", result); }
public static List <string> ProcessTree( IGraphNode node, List <string> result, Action <IGraphNode, NodeMetadata, List <string> > processNode, Action <IGraphNode, IGraphNode, NodeMetadata, List <string> > processChild, NodeMetadata metadata) { if (metadata.IsNodeDataProcessed(node, processNode)) { return(result); } metadata.SetNodeDataProcessed(node, processNode); processNode(node, metadata, result); if (node is ISender sender) { foreach (var listener in sender.Children) { processChild(node, listener.CheckForwarding(), metadata, result); ProcessTree(listener.CheckForwarding(), result, processNode, processChild, metadata); } } return(result); }
private static void AppendFunctionalPipe(IGraphNode node, NodeMetadata metadata, List <string> result) { switch (node) { case IGraphNodeWithOutput functionPipe: AppendFunctionPipe(functionPipe, metadata, result); break; } }
public static List <string> AppendRankings(IEnumerable <IGraphNode> nodes, NodeMetadata metadata) { var result = new List <string>(); foreach (var node in nodes) { DotGraph.ProcessTree(node, result, delegate { }, ProcessChildRanking, metadata); } return(result); }
private static void ProcessChildRanking( IGraphNode node, IGraphNode listener, NodeMetadata metadata, List <string> result) { if (listener.GetType().GetGenericTypeDefinition() == typeof(CollectorPipe <>)) { var listenerUniqueName = metadata.GetQuotedUniqueName(listener); result.Add($"{{ rank=same; {metadata.GetQuotedUniqueName(node)}, {listenerUniqueName}}}\n"); } }
private static void AppendFunctionPipeFormatting(IGraphNode node, NodeMetadata metadata, StringBuilder result) { var output = ((IGraphNodeWithOutput)node).Output; var label = metadata.GetCount(output) == 0 ? "" : $"label={metadata.GetQuotedDisplayName(output)}, "; var outputUniqueName = metadata.GetQuotedUniqueName(output); AppendFormat(outputUniqueName, $@"{label}color=""#9fbff4""", result); var functionLabel = metadata.GetCount(node) == 0 ? "" : $"label={metadata.GetQuotedDisplayName(node)}, "; var functionUniqueName = metadata.GetQuotedUniqueName(node); AppendFormat(functionUniqueName, $@"{functionLabel}shape=invhouse", result); }
private static void AppendJoinedPipesFormatting(IGraphNode node, NodeMetadata metadata, List <string> result) { var output = ((IGraphNodeWithOutput)node).Output; var label = metadata.GetCount(output) == 0 ? "" : $"label={metadata.GetQuotedDisplayName(output)}, "; var outputUniqueName = metadata.GetQuotedUniqueName(output); AppendFormat(outputUniqueName, $@"{label}color=""#9fbff4""", result); var functionLabel = metadata.GetCount(node) == 0 ? "" : $"label={metadata.GetQuotedDisplayName(node)}, "; var functionUniqueName = metadata.GetQuotedUniqueName(node); AppendFormat(functionUniqueName, $@"{functionLabel}color=pink", result); }
public static DotGraph FromPipeline(IGraphNode node) { var roots = GetRoots(node).ToList(); var metadata = new NodeMetadata(roots); var nodes = DotGraphNodes.AppendNodeAndChildren(roots, metadata); var formatting = DotGraphFormatting.AppendFormatting(roots, metadata); var rankings = DotGraphRanking.AppendRankings(roots, metadata); return(new DotGraph { nodes = nodes, formatting = formatting, rankings = rankings }); }
public static string FromPipeline(IGraphNode node) { var roots = GetRoots(node).ToList(); var metadata = new NodeMetadata(roots); return($@" digraph G {{ node [style=filled, shape=rec] # Nodes {DotGraphNodes.AppendNodeAndChildren(roots, metadata)} # Formatting {DotGraphFormatting.AppendFormatting(roots, metadata)} {DotGraphRanking.AppendRankings(roots, metadata)} }} ".Trim()); }
public static StringBuilder AppendFormatting(IEnumerable <IGraphNode> nodes, NodeMetadata metadata) { void ProcessNode(IGraphNode node_, NodeMetadata metadata_, StringBuilder result_) { var genericTypeDefinition = node_.GetType().GetGenericTypeDefinition(); if (!PipeAppendersByType.ContainsKey(genericTypeDefinition)) { throw new NotImplementedException( $@"No DotGraph formatting for {node_.GetType().ToReadableString()}"); } PipeAppendersByType[genericTypeDefinition](node_, metadata_, result_); } var result = new StringBuilder(); foreach (var node in nodes) { DotGraph.ProcessTree(node, result, ProcessNode, delegate { }, metadata); } return(result); }
public static List <string> AppendNodeAndChildren(IEnumerable <IGraphNode> nodes, NodeMetadata metadata) { var result = new List <string>(); foreach (var node in nodes) { DotGraph.ProcessTree(node, result, AppendFunctionalPipe, delegate { }, metadata); } return(result); }
private static void AppendInputPipeFormatting(IGraphNode node, NodeMetadata metadata, StringBuilder result) { var uniqueName = metadata.GetQuotedUniqueName(node); AppendFormat(uniqueName, @"color=green", result); }