@@ -28,23 +28,23 @@ static IEnumerable<T[]> SubsetsProgressiveCore(IReadOnlyList<T> source, int coun
2828 {
2929 if ( count == 1 )
3030 {
31- foreach ( var e in source )
31+ foreach ( T ? e in source )
3232 {
3333 buffer [ 0 ] = e ;
3434 yield return buffer ;
3535 }
3636 yield break ;
3737 }
3838
39- var lastSlot = count - 1 ;
40- var pool = lastSlot > 128 ? ArrayPool < int > . Shared : null ;
41- var indices = pool ? . Rent ( lastSlot ) ?? new int [ lastSlot ] ;
39+ int lastSlot = count - 1 ;
40+ ArrayPool < int > ? pool = lastSlot > 128 ? ArrayPool < int > . Shared : null ;
41+ int [ ] ? indices = pool ? . Rent ( lastSlot ) ?? new int [ lastSlot ] ;
4242 try
4343 {
44- using var e = source . GetEnumerator ( ) ;
44+ using IEnumerator < T > ? e = source . GetEnumerator ( ) ;
4545
46- // Setup the first result and make sure there's enough for the count.
47- var n = 0 ;
46+ // Setup the first result and make sure there's enough for the count.
47+ int n = 0 ;
4848 for ( ; n < count ; ++ n )
4949 {
5050 if ( ! e . MoveNext ( ) ) throw new ArgumentOutOfRangeException ( nameof ( count ) , count , "Is greater than the length of the source." ) ;
@@ -57,9 +57,9 @@ static IEnumerable<T[]> SubsetsProgressiveCore(IReadOnlyList<T> source, int coun
5757 while ( e . MoveNext ( ) )
5858 {
5959 buffer [ lastSlot ] = e . Current ;
60- foreach ( var _ in Collections . Subsets . IndexesInternal ( n , lastSlot , indices ) )
60+ foreach ( int [ ] ? _ in Collections . Subsets . IndexesInternal ( n , lastSlot , indices ) )
6161 {
62- for ( var i = 0 ; i < lastSlot ; i ++ )
62+ for ( int i = 0 ; i < lastSlot ; i ++ )
6363 buffer [ i ] = source [ indices [ i ] ] ;
6464
6565 yield return buffer ;
@@ -79,12 +79,12 @@ static IEnumerable<T[]> SubsetsProgressiveCore(IReadOnlyList<T> source, int coun
7979 /// <returns>An enumerable containing the resultant subsets as a memory buffer.</returns>
8080 public static IEnumerable < ReadOnlyMemory < T > > SubsetsProgressiveBuffered < T > ( this IReadOnlyList < T > source , int count )
8181 {
82- var pool = count > 128 ? ArrayPool < T > . Shared : null ;
83- var buffer = pool ? . Rent ( count ) ?? new T [ count ] ;
82+ ArrayPool < T > ? pool = count > 128 ? ArrayPool < T > . Shared : null ;
83+ T [ ] ? buffer = pool ? . Rent ( count ) ?? new T [ count ] ;
8484 var readBuffer = new ReadOnlyMemory < T > ( buffer , 0 , count ) ;
8585 try
8686 {
87- foreach ( var _ in SubsetsProgressive ( source , count , buffer ) )
87+ foreach ( T [ ] ? _ in SubsetsProgressive ( source , count , buffer ) )
8888 yield return readBuffer ;
8989 }
9090 finally
@@ -103,7 +103,34 @@ public static IEnumerable<ReadOnlyMemory<T>> SubsetsProgressiveBuffered<T>(this
103103 /// <returns>An enumerable containing the resultant subsets.</returns>
104104 public static IEnumerable < T [ ] > SubsetsProgressive < T > ( this IReadOnlyList < T > source , int count )
105105 {
106- foreach ( var subset in SubsetsProgressiveBuffered ( source , count ) )
107- yield return subset . ToArray ( ) ;
106+ ArrayPool < T > ? pool = count > 128 ? ArrayPool < T > . Shared : null ;
107+ T [ ] ? buffer = pool ? . Rent ( count ) ?? new T [ count ] ;
108+ try
109+ {
110+ foreach ( T [ ] ? _ in SubsetsProgressive ( source , count , buffer ) )
111+ {
112+ var a = new T [ count ] ;
113+ buffer . CopyTo ( a . AsSpan ( ) ) ;
114+ yield return a ;
115+ }
116+ }
117+ finally
118+ {
119+ pool ? . Return ( buffer , true ) ;
120+ }
121+ }
122+
123+ /// <param name="source">The source list to derive from.</param>
124+ /// <param name="count">The maximum number of items in the result sets.</param>
125+ /// <param name="pool">The array pool to get result arrays from.</param>
126+ /// <inheritdoc cref="SubsetsProgressive{T}(IReadOnlyList{T}, int)" />
127+ public static IEnumerable < ArrayPoolSegment < T > > SubsetsProgressive < T > ( this IReadOnlyList < T > source , int count , ArrayPool < T > ? pool , bool clearArray = false )
128+ {
129+ foreach ( ReadOnlyMemory < T > subset in SubsetsProgressiveBuffered ( source , count ) )
130+ {
131+ var a = new ArrayPoolSegment < T > ( count , pool , clearArray ) ;
132+ subset . CopyTo ( a ) ;
133+ yield return a ;
134+ }
108135 }
109136}
0 commit comments