< Summary

Class:Towel.ArrayHelper
Assembly:Towel
File(s):File 1: /home/runner/work/Towel/Towel/Sources/Towel/ArrayHelper.cs
Covered lines:41
Uncovered lines:3
Coverable lines:44
Total lines:70
Line coverage:93.1% (41 of 44)
Covered branches:17
Total branches:20
Branch coverage:85% (17 of 20)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
File 1: NewFromRanges(...)100%1100%
File 1: NewFromRanges(...)100%10%
File 1: NewFromRanges(...)85%2095.23%

File(s)

/home/runner/work/Towel/Towel/Sources/Towel/ArrayHelper.cs

#LineLine coverage
 1namespace Towel;
 2
 3/// <summary>Static helper methods for arrays.</summary>
 4public static class ArrayHelper
 5{
 6  /// <summary>Constructs a new 1D array from a sequence of ranges.</summary>
 7  /// <returns>A new 1D array from the sequence of ranges.</returns>
 8  /// <inheritdoc cref="NewFromRanges{T, TSelect}(TSelect, Range[])"/>
 9  public static int[] NewFromRanges(params Range[] ranges) =>
 5510    NewFromRanges<int, Identity<int>>(default, ranges);
 11
 12  /// <inheritdoc cref="NewFromRanges{T, TSelect}(TSelect, Range[])"/>
 13  public static T[] NewFromRanges<T>(Func<int, T> select, params Range[] ranges) =>
 014    NewFromRanges<T, SFunc<int, T>>(select, ranges);
 15
 16  /// <summary>Constructs a new 1D array from a sequence of ranges and a selction method.</summary>
 17  /// <typeparam name="T">The element type of the array to construct.</typeparam>
 18  /// <typeparam name="TSelect">The type of method for selecting <typeparamref name="T"/> from <see cref="int"/> values.
 19  /// <param name="select">The method for selecting <typeparamref name="T"/> from <see cref="int"/> values.</param>
 20  /// <param name="ranges">The ranges to construct the array from.</param>
 21  /// <returns>A new 1D array from the sequence of ranges and the selction method.</returns>
 22  public static T[] NewFromRanges<T, TSelect>(TSelect select, params Range[] ranges)
 23    where TSelect : struct, IFunc<int, T>
 5524  {
 5525    if (ranges is null) throw new ArgumentNullException(nameof(ranges));
 5526    int length = 0;
 44927    foreach (var range in ranges)
 14228    {
 14229      {
 14230        if (sourceof(range.Start.IsFromEnd, out string c1))
 031        {
 032          throw new ArgumentException(c1, nameof(ranges));
 33        }
 14234      }
 42635      { if (sourceof(range.End.IsFromEnd, out string c2)) throw new ArgumentException(c2, nameof(ranges)); }
 14236      if (range.Start.Value < range.End.Value)
 6337      {
 6338        length += range.End.Value - range.Start.Value;
 6339      }
 40      else
 7941      {
 7942        length += range.Start.Value - range.End.Value;
 7943      }
 14244    }
 5545    if (length is 0)
 346    {
 347      return Array.Empty<T>();
 48    }
 5249    T[] result = new T[length];
 5250    int index = 0;
 43451    foreach (var range in ranges)
 13952    {
 13953      if (range.Start.Value < range.End.Value)
 6354      {
 7084655        for (int i = range.Start.Value; i < range.End.Value; i++)
 3536056        {
 3536057          result[index++] = select.Invoke(i);
 3536058        }
 6359      }
 60      else
 7661      {
 153862        for (int i = range.Start.Value; i > range.End.Value; i--)
 69363        {
 69364          result[index++] = select.Invoke(i);
 69365        }
 7666      }
 13967    }
 5268    return result;
 5569  }
 70}