public void WriteJson()

in DataExtraction/SourceGraphExtractionUtils/Utils/DirectedGraph.cs [206:277]


        public void WriteJson(JsonWriter jWriter, Dictionary<TNode, int> nodeNumberer,
            IEnumerable<Action<JsonWriter, Dictionary<TNode, int>>> additionalNodeInfoWriters,
            IEnumerable<(Predicate<TEdgeLabel> acceptsEdgeLabel, Action<JsonWriter, (TNode From, TNode To)> writer)> additionalEdgeInfoWriters)
        {
            jWriter.WriteStartObject();

            // Group by edge type
            var edgesByType = new Dictionary<TEdgeLabel, List<(TNode From, TNode To)>>();
            foreach (var edge in Nodes.SelectMany(n => GetOutEdges(n)))
            {
                if (!edgesByType.TryGetValue(edge.Label, out var edgeList))
                {
                    edgeList = new List<(TNode from, TNode to)>();
                    edgesByType.Add(edge.Label, edgeList);
                }
                edgeList.Add((edge.Source, edge.Target));
            }

            // Write Edges
            jWriter.WritePropertyName("Edges");
            
            jWriter.WriteStartObject();
            foreach (var (edgeType, edges) in edgesByType)
            {
                jWriter.WritePropertyName(edgeType.ToString());
                jWriter.WriteStartArray();
                foreach (var (From, To) in edges)
                {
                    jWriter.WriteStartArray();
                    WriteNodeJson(jWriter, nodeNumberer, From);
                    WriteNodeJson(jWriter, nodeNumberer, To);
                    jWriter.WriteEndArray();
                }
                jWriter.WriteEndArray();
            }
            jWriter.WriteEndObject();

            // Write Edge Values, if any
            jWriter.WritePropertyName("EdgeValues");
            jWriter.WriteStartObject();
            foreach (var (edgeType, edges) in edgesByType)
            {
                var usedEdgeInfoWriters = additionalEdgeInfoWriters
                    .Where(edgeWriter => edgeWriter.acceptsEdgeLabel(edgeType))
                    .Select(e => e.writer).ToArray();
                if (usedEdgeInfoWriters.Length == 0)
                {
                    continue;
                }

                jWriter.WritePropertyName(edgeType.ToString());
                jWriter.WriteStartArray();
                foreach (var (From, To) in edges)
                {
                    jWriter.WriteStartArray();
                    foreach (var edgeInfoWriter in usedEdgeInfoWriters)
                    {
                        edgeInfoWriter(jWriter, (From, To));
                    }
                    jWriter.WriteEndArray();
                }
                jWriter.WriteEndArray();
            }
            jWriter.WriteEndObject();

            foreach (var additionalWriter in additionalNodeInfoWriters)
            {
                additionalWriter(jWriter, nodeNumberer);
            }

            jWriter.WriteEndObject();
        }