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);
        }
示例#3
0
        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;
     }
 }
示例#5
0
        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);
        }
示例#6
0
 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);
        }
示例#8
0
        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);
        }
示例#9
0
        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);
        }
示例#12
0
        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);
        }