< Summary

Information
Class: MoreStructures.RecImmTrees.Conversions.FullyRecursiveStringifier<T1, T2>
Assembly: MoreStructures
File(s): /home/runner/work/MoreStructures/MoreStructures/MoreStructures/RecImmTrees/Conversions/FullyRecursiveStringifier.cs
Line coverage
100%
Covered lines: 28
Uncovered lines: 0
Coverable lines: 28
Total lines: 69
Line coverage: 100%
Branch coverage
100%
Covered branches: 10
Total branches: 10
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
Stringify(...)100%1100%
Stringify(...)100%6100%
Stringify(...)100%1100%
Stringify()100%4100%

File(s)

/home/runner/work/MoreStructures/MoreStructures/MoreStructures/RecImmTrees/Conversions/FullyRecursiveStringifier.cs

#LineLine coverage
 1namespace MoreStructures.RecImmTrees.Conversions;
 2
 3/// <summary>
 4///     <inheritdoc/>
 5///     Recursive implementation.
 6/// </summary>
 7/// <typeparam name="TEdge">The type of edges of the specific structure.</typeparam>
 8/// <typeparam name="TNode">The type of nodes of the specific structure.</typeparam>
 9/// <remarks>
 10///     <inheritdoc cref="IStringifier{TEdge, TNode}" path="/remarks"/>
 11///     <para id="advantages">
 12///     ADVANTAGES AND DISADVANTAGES
 13///     <br/>
 14///     Implemented fully recursively, so limited by stack depth and usable with tree of a "reasonable" height.
 15///     </para>
 16/// </remarks>
 17public class FullyRecursiveStringifier<TEdge, TNode>
 18    : StringifierBase<TEdge, TNode>, IStringifier<TEdge, TNode>
 19    where TEdge : IRecImmDictIndexedTreeEdge<TEdge, TNode>, IComparable<TEdge>
 20    where TNode : IRecImmDictIndexedTreeNode<TEdge, TNode>
 21{
 22    /// <inheritdoc path="//*[not(self::remarks)]"/>
 23    /// <inheritdoc cref="FullyRecursiveStringifier{TEdge, TNode}" path="/remarks"/>
 24    public FullyRecursiveStringifier(
 25        Func<TNode, string> rootStringifier, Func<TEdge, TNode, string> edgeAndNodeStringifier)
 1226        : base(rootStringifier, edgeAndNodeStringifier)
 1227    {
 1228    }
 29
 30    /// <inheritdoc path="//*[not(self::remarks)]"/>
 31    /// <inheritdoc cref="FullyRecursiveStringifier{TEdge, TNode}" path="/remarks"/>
 32    public override string Stringify(TNode node)
 733    {
 734        var stringBuilder = new StringBuilder();
 735        stringBuilder.Append(RootStringifier(node));
 736        Stringify(stringBuilder, node, 0);
 737        return stringBuilder.ToString();
 738    }
 39
 40    private void Stringify(StringBuilder stringBuilder, TNode node, int level)
 12241    {
 71142        foreach (var (childEdge, childNode) in node.Children.OrderBy(c => c.Key))
 11543        {
 11544            stringBuilder.Append(NewLine);
 994845            for (int i = 0; i < level; i++)
 485946                stringBuilder.Append(Indent);
 11547            stringBuilder.Append($"{Indent}{EdgeAndNodeStringifier(childEdge, childNode)}");
 11548            Stringify(stringBuilder, childNode, level + 1);
 11549        }
 12250    }
 51
 52
 53    /// <inheritdoc path="//*[not(self::remarks)]"/>
 54    /// <inheritdoc cref="FullyRecursiveStringifier{TEdge, TNode}" path="/remarks"/>
 55    public override string Stringify(TreePath<TEdge, TNode> path) =>
 356        string.Join(PathSeparator, Stringify(path.PathNodes));
 57
 58    private IEnumerable<string> Stringify(IEnumerable<KeyValuePair<TEdge, TNode>> pathNodes)
 759    {
 760        if (!pathNodes.Any())
 361            yield break;
 62
 463        var nextPathNode = pathNodes.First();
 464        yield return EdgeAndNodeStringifier(nextPathNode.Key, nextPathNode.Value);
 65
 1866        foreach (var fragment in Stringify(pathNodes.Skip(1)))
 367            yield return fragment;
 468    }
 69}