Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generator refactor #387

Open
wants to merge 61 commits into
base: whitesource/configure
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
9774aa5
Remove passing-by-reference feature (#335)
aalmada Feb 27, 2021
b64e633
3.0.0-beta41
aalmada Feb 27, 2021
b4c4dcd
NetFabric.Hyperlinq.Abstractions 1.1.0
aalmada Feb 27, 2021
4ddf043
Fix build (#338)
aalmada Feb 28, 2021
87b6c24
Use correct NuGet link (#336)
jzebedee Feb 28, 2021
b2ea96c
Add AsValueEnumerable() for Span<> and ReadOnlySpan<> (#337)
aalmada Feb 28, 2021
cd74cd2
Add missing operator overloads (#339)
aalmada Mar 2, 2021
cf6519a
Code cleanup (#340)
aalmada Mar 3, 2021
4ddac76
Optimize ImmutableArray<> by getting inner array (#341)
aalmada Mar 4, 2021
893396f
Improve coverage (#342)
aalmada Mar 4, 2021
117928f
3.0.0-beta44
aalmada Mar 5, 2021
89c364f
Fix sentence
aalmada Mar 5, 2021
c65f579
Add NetFabric.Hyperlinq.Immutable project (#343)
aalmada Mar 5, 2021
099a2dd
Add bindings for collections in System.Collections.Generic (#344)
aalmada Mar 6, 2021
2459670
Update benchmarks (#345)
aalmada Mar 8, 2021
f41a010
Test Sum() for NaN and Infinity
aalmada Mar 8, 2021
98e83e9
Fix coverage (#346)
aalmada Mar 9, 2021
3aa217c
Code review (#347)
aalmada Mar 9, 2021
587aa01
Add GeneratorBindingsAttribute (#348)
aalmada Mar 13, 2021
a4baad3
Upgrade to .NET 6.0 (#349)
aalmada Mar 13, 2021
cc437fc
Fix benchmarks
aalmada Mar 14, 2021
0fc76de
Fix Where for ValueEnumerable
aalmada Mar 14, 2021
f4146ed
Test NetFabric.Hyperlinq.Immutable (#350)
aalmada Mar 15, 2021
6199b1a
Refactor handling of IReadOnlyList (#351)
aalmada Mar 15, 2021
4e90475
Benchmark fixes (#352)
aalmada Mar 17, 2021
2e637e0
Fix conversion and Sum for ReadOnlyList
aalmada Mar 18, 2021
7c97136
Update benchmark results
aalmada Mar 19, 2021
a86fad2
Add ValueMemoryOwner (#355)
aalmada May 12, 2021
028db60
Update StructLinq to 0.26.0 (#354)
reegeek May 12, 2021
a8e30a5
Refactor handling of lists (#356)
aalmada May 18, 2021
935fb60
Refactor indexer bounds checking (#357)
aalmada May 18, 2021
daab08e
Add array.ToArray() benchmarks (#358)
aalmada May 30, 2021
8b57da1
Use enumerator instead of indexer
aalmada May 23, 2021
01017e1
Update benchmark results
aalmada Jun 5, 2021
e8ce7c9
Fix casts to ICollection
aalmada Jun 5, 2021
d5eb373
Update benchmark results
aalmada Jun 6, 2021
4d75ba9
Update benchmark results for .NET 6.0 Preview 5
aalmada Jun 18, 2021
193789c
Array iteration benchmarks
aalmada Jun 20, 2021
9bb2afa
Use Length - 1
aalmada Jun 20, 2021
6a7e3e3
Use Length - 1
aalmada Jun 20, 2021
e78d541
Add Vector benchmarks
aalmada Jun 21, 2021
e3c97cf
Cleanup
aalmada Jun 26, 2021
3c29ee4
Improve performance of Sum() (#370)
aalmada Jun 28, 2021
2a8f961
Add Count(predicate) (#363)
aalmada Jul 1, 2021
59d8d40
Fix Contains() and ToArray() (#376)
aalmada Sep 1, 2021
647af4c
Review ToArray() (#378)
aalmada Sep 5, 2021
c3fa93a
Review ToArray on enumerables (#379)
aalmada Sep 6, 2021
d12a525
Add Lease<> type (#380)
aalmada Sep 9, 2021
5eee317
Fix SingleAsync() (#381)
aalmada Sep 11, 2021
efaaa5d
Bump version to 3.0.0-beta46 (#382)
aalmada Sep 14, 2021
1878308
Make Lease<> constructor public (#383)
aalmada Sep 23, 2021
d62f946
3.0.0-beta47
aalmada Sep 23, 2021
40a2e76
Make ArrayPoolExtensions public (#384)
aalmada Sep 23, 2021
9abf381
Remove NoInliningAttribute for Throw methods (#385)
aalmada Sep 27, 2021
d6ed2e4
Refactor the source generator to be public
aalmada Jul 7, 2021
2c13b9b
Remove Obsolete
aalmada Sep 23, 2021
013b6e6
Fix build
aalmada Sep 24, 2021
868abd6
Refactor CodeBuilder
aalmada Sep 29, 2021
e02c80f
Fix build
aalmada Oct 4, 2021
dc1c008
Refactor CodeBuilder
aalmada Oct 6, 2021
60a3456
Fix code generation
aalmada Oct 8, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add Count(predicate) (#363)
  • Loading branch information
aalmada authored Jul 1, 2021

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
commit 2a8f9618e4c55b3312d842b0bef99a4789f6f402
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -4,7 +4,7 @@
<PropertyGroup>
<Authors>Antao Almada</Authors>
<Copyright>Copyright 2019-2021 Antao Almada</Copyright>
<LangVersion>9.0</LangVersion>
<LangVersion>latest</LangVersion>
<Features>strict</Features>
<Nullable>enable</Nullable>
</PropertyGroup>
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net461;net5.0;netstandard2.0;netstandard2.1</TargetFrameworks>
<TargetFrameworks>net5.0;netstandard2.0;netstandard2.1</TargetFrameworks>
<PackageId>NetFabric.Hyperlinq.Abstractions</PackageId>
<Title>NetFabric.Hyperlinq.Abstractions</Title>
<Description>Abstractions for high performance enumeration.</Description>
<Version>1.2.0</Version>
<Version>1.3.0</Version>
<PackageIcon>Icon.png</PackageIcon>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageTags>netfabric, hyperlinq, abstractions, linq, enumeration, performance</PackageTags>
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<PackageReleaseNotes></PackageReleaseNotes>
</PropertyGroup>

Original file line number Diff line number Diff line change
@@ -18,9 +18,9 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="BenchmarkDotNet" Version="0.13.0.1555" />
<PackageReference Include="BenchmarkDotNet" Version="0.13.0.1561" />
<PackageReference Include="LinqFaster.SIMD" Version="1.0.3" />
<PackageReference Include="StructLinq" Version="0.26.0" />
<PackageReference Include="StructLinq" Version="0.27.0" />
<PackageReference Include="System.Interactive" Version="5.0.0" />
<PackageReference Include="System.Interactive.Async" Version="5.0.0" />
<PackageReference Include="System.Linq.Async" Version="5.0.0" />
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net461;netstandard2.0</TargetFrameworks>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<PackageId>NetFabric.Hyperlinq.Immutable</PackageId>
<Title>NetFabric.Hyperlinq.Immutable</Title>
<Description> High performance LINQ implementation with minimal heap allocations. Supports all collections in System.Collections.Immutable.</Description>
@@ -36,7 +36,7 @@
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
<PackageReference Include="Meziantou.Analyzer" Version="1.0.663">
<PackageReference Include="Meziantou.Analyzer" Version="1.0.667">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
</PackageReference>
Original file line number Diff line number Diff line change
@@ -7,7 +7,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.9.0" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.10.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.10.0" />
<PackageReference Include="NetFabric.Assertive" Version="3.0.1" />
<PackageReference Include="xunit" Version="2.4.1" />
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.9.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.10.0" PrivateAssets="all" />
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" />
<PackageReference Include="Nullable" Version="1.3.0">
<PrivateAssets>all</PrivateAssets>
5 changes: 4 additions & 1 deletion NetFabric.Hyperlinq.SourceGenerator/OverloadsGenerator.cs
Original file line number Diff line number Diff line change
@@ -344,7 +344,10 @@ void GenerateMethodSource(CodeBuilder builder, CompilationContext context, IName

if (isExtensionMethod)
{
_ = builder.AppendLine($"public static {methodReturnType} {methodName}{methodGenericParametersString}(this {methodExtensionType} source{methodParameters})");
var extraMethodParameter = methodParameters is { Length: 0 }
? string.Empty
: $", {methodParameters}";
_ = builder.AppendLine($"public static {methodReturnType} {methodName}{methodGenericParametersString}(this {methodExtensionType} source{extraMethodParameter})");

firstCallParameter = bindingsAttribute is null
? "source"
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ public void AsValueEnumerable_With_ImmutableArray_Must_ReturnWrapper(int[] sourc
.BeOfType<ArrayExtensions.ArraySegmentValueEnumerable<int>>()
.BeEnumerableOf<int>()
.BeEqualTo(wrapped, testRefStructs: false);
result.SequenceEqual(wrapped).Must().BeTrue();
_ = result.SequenceEqual(wrapped).Must().BeTrue();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net461;netcoreapp2.1;netcoreapp3.1;net6.0</TargetFrameworks>
<TargetFrameworks>net48;netcoreapp2.1;netcoreapp3.1;net6.0</TargetFrameworks>
<IsPackable>false</IsPackable>
</PropertyGroup>

@@ -24,7 +24,7 @@
</PackageReference>
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)'=='net461' Or '$(TargetFramework)'=='netcoreapp2.1'">
<ItemGroup Condition="'$(TargetFramework)'=='net48' Or '$(TargetFramework)'=='netcoreapp2.1'">
<ProjectReference Include="..\NetFabric.Hyperlinq.Immutable\NetFabric.Hyperlinq.Immutable.csproj" />
<PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="5.0.0" />
</ItemGroup>
14 changes: 10 additions & 4 deletions NetFabric.Hyperlinq/Aggregation/Count/Count.ReadOnlySpan.cs
Original file line number Diff line number Diff line change
@@ -9,8 +9,11 @@ public static partial class ArrayExtensions
static int Count<TSource>(this ReadOnlySpan<TSource> source)
=> source.Length;

[GeneratorIgnore]
static int Count<TSource, TPredicate>(this ReadOnlySpan<TSource> source, TPredicate predicate)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static int Count<TSource>(this ReadOnlySpan<TSource> source, Func<TSource, bool> predicate)
=> source.Count(new FunctionWrapper<TSource, bool>(predicate));

static int Count<TSource, TPredicate>(this ReadOnlySpan<TSource> source, TPredicate predicate = default)
where TPredicate: struct, IFunction<TSource, bool>
{
var counter = 0;
@@ -21,8 +24,11 @@ static int Count<TSource, TPredicate>(this ReadOnlySpan<TSource> source, TPredic
return counter;
}

[GeneratorIgnore]
static int CountAt<TSource, TPredicate>(this ReadOnlySpan<TSource> source, TPredicate predicate)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
static int Count<TSource>(this ReadOnlySpan<TSource> source, Func<TSource, int, bool> predicate)
=> source.CountAt(new FunctionWrapper<TSource, int, bool>(predicate));

static int CountAt<TSource, TPredicate>(this ReadOnlySpan<TSource> source, TPredicate predicate = default)
where TPredicate: struct, IFunction<TSource, int, bool>
{
var counter = 0;
22 changes: 17 additions & 5 deletions NetFabric.Hyperlinq/Aggregation/Count/Count.ValueEnumerable.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace NetFabric.Hyperlinq
{
@@ -17,9 +19,14 @@ public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable sour
}
return counter;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, bool> predicate)
where TEnumerable : IValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
=> source.Count<TEnumerable, TEnumerator, TSource, FunctionWrapper<TSource, bool>>(new FunctionWrapper<TSource, bool>(predicate));

[GeneratorIgnore]
internal static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate)
public static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default)
where TEnumerable : IValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate: struct, IFunction<TSource, bool>
@@ -33,9 +40,14 @@ internal static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TE
}
return counter;
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, int, bool> predicate)
where TEnumerable : IValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
=> source.CountAt<TEnumerable, TEnumerator, TSource, FunctionWrapper<TSource, int, bool>>(new FunctionWrapper<TSource, int, bool>(predicate));

[GeneratorIgnore]
internal static int CountAt<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate)
public static int CountAt<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default)
where TEnumerable : IValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate: struct, IFunction<TSource, int, bool>
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;

namespace NetFabric.Hyperlinq
{
@@ -9,8 +11,13 @@ public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable sour
where TEnumerator : struct, IEnumerator<TSource>
=> source.Count;

[GeneratorIgnore]
static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, bool> predicate)
where TEnumerable : IValueReadOnlyCollection<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
=> Count<TEnumerable, TEnumerator, TSource, FunctionWrapper<TSource, bool>>(source, new FunctionWrapper<TSource, bool>(predicate));

public static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default)
where TEnumerable : IValueReadOnlyCollection<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate: struct, IFunction<TSource, bool>
@@ -19,9 +26,14 @@ static int Count<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable
{Count: 0} => 0,
_ => ValueEnumerableExtensions.Count<TEnumerable, TEnumerator, TSource, TPredicate>(source, predicate)
};

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, int, bool> predicate)
where TEnumerable : IValueReadOnlyCollection<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
=> CountAt<TEnumerable, TEnumerator, TSource, FunctionWrapper<TSource, int, bool>>(source, new FunctionWrapper<TSource, int, bool>(predicate));

[GeneratorIgnore]
static int CountAt<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate)
public static int CountAt<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default)
where TEnumerable : IValueReadOnlyCollection<TSource, TEnumerator>
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate: struct, IFunction<TSource, int, bool>
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System.Collections.Generic;
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;

@@ -27,8 +29,13 @@ public static async ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource>
return counter;
}

[GeneratorIgnore]
static async ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, CancellationToken, ValueTask<bool>> predicate, CancellationToken cancellationToken = default)
where TEnumerable : IAsyncValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IAsyncEnumerator<TSource>
=> source.CountAsync<TEnumerable, TEnumerator, TSource, AsyncFunctionWrapper<TSource, bool>>(new AsyncFunctionWrapper<TSource, bool>(predicate), cancellationToken);

public static async ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default, CancellationToken cancellationToken = default)
where TEnumerable : IAsyncValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IAsyncEnumerator<TSource>
where TPredicate: struct, IAsyncFunction<TSource, bool>
@@ -53,8 +60,13 @@ static async ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource, TPredi
return counter;
}

[GeneratorIgnore]
static async ValueTask<int> CountAtAsync<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ValueTask<int> CountAsync<TEnumerable, TEnumerator, TSource>(this TEnumerable source, Func<TSource, int, CancellationToken, ValueTask<bool>> predicate, CancellationToken cancellationToken = default)
where TEnumerable : IAsyncValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IAsyncEnumerator<TSource>
=> source.CountAtAsync<TEnumerable, TEnumerator, TSource, AsyncFunctionWrapper<TSource, int, bool>>(new AsyncFunctionWrapper<TSource, int, bool>(predicate), cancellationToken);

public static async ValueTask<int> CountAtAsync<TEnumerable, TEnumerator, TSource, TPredicate>(this TEnumerable source, TPredicate predicate = default, CancellationToken cancellationToken = default)
where TEnumerable : IAsyncValueEnumerable<TSource, TEnumerator>
where TEnumerator : struct, IAsyncEnumerator<TSource>
where TPredicate: struct, IAsyncFunction<TSource, int, bool>
Original file line number Diff line number Diff line change
@@ -110,6 +110,24 @@ public bool Contains(TSource value, IEqualityComparer<TSource>? comparer)
public static int Count<TSource>(this ValueEnumerable<TSource> source)
=> source.Count;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource>(this ValueEnumerable<TSource> source, Func<TSource, bool> predicate)
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource, TPredicate>(this ValueEnumerable<TSource> source, TPredicate predicate = default)
where TPredicate : struct, IFunction<TSource, bool>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource>(this ValueEnumerable<TSource> source, Func<TSource, int, bool> predicate)
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CountAt<TSource, TPredicate>(this ValueEnumerable<TSource> source, TPredicate predicate = default)
where TPredicate : struct, IFunction<TSource, int, bool>
=> source.CountAt(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Sum(this ValueEnumerable<int> source)
=> ValueReadOnlyCollectionExtensions.Sum<ValueEnumerable<int>, ValueEnumerator<int>, int, int>(source);
Original file line number Diff line number Diff line change
@@ -182,6 +182,28 @@ public static int Count<TList, TSource>(this ValueEnumerable<TList, TSource> sou
where TList : IReadOnlyList<TSource>
=> source.Count;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TList, TSource>(this ValueEnumerable<TList, TSource> source, Func<TSource, bool> predicate)
where TList : IReadOnlyList<TSource>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TList, TSource, TPredicate>(this ValueEnumerable<TList, TSource> source, TPredicate predicate = default)
where TList : IReadOnlyList<TSource>
where TPredicate : struct, IFunction<TSource, bool>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TList, TSource>(this ValueEnumerable<TList, TSource> source, Func<TSource, int, bool> predicate)
where TList : IReadOnlyList<TSource>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CountAt<TList, TSource, TPredicate>(this ValueEnumerable<TList, TSource> source, TPredicate predicate = default)
where TList : IReadOnlyList<TSource>
where TPredicate : struct, IFunction<TSource, int, bool>
=> source.CountAt(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Sum<TList>(this ValueEnumerable<TList, int> source)
where TList : IReadOnlyList<int>
Original file line number Diff line number Diff line change
@@ -100,6 +100,28 @@ public static int Count<TSource, TEnumerator>(this ValueEnumerable<TSource, TEnu
where TEnumerator : struct, IEnumerator<TSource>
=> source.Count;

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource, TEnumerator>(this ValueEnumerable<TSource, TEnumerator> source, Func<TSource, bool> predicate)
where TEnumerator : struct, IEnumerator<TSource>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource, TEnumerator, TPredicate>(this ValueEnumerable<TSource, TEnumerator> source, TPredicate predicate = default)
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate : struct, IFunction<TSource, bool>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Count<TSource, TEnumerator>(this ValueEnumerable<TSource, TEnumerator> source, Func<TSource, int, bool> predicate)
where TEnumerator : struct, IEnumerator<TSource>
=> source.Count(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int CountAt<TSource, TEnumerator, TPredicate>(this ValueEnumerable<TSource, TEnumerator> source, TPredicate predicate = default)
where TEnumerator : struct, IEnumerator<TSource>
where TPredicate : struct, IFunction<TSource, int, bool>
=> source.CountAt(predicate);

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static int Sum<TEnumerator>(this ValueEnumerable<int, TEnumerator> source)
where TEnumerator : struct, IEnumerator<int>
Loading