diff --git a/.editorconfig b/.editorconfig index 4cead120d..57d0ce66a 100755 --- a/.editorconfig +++ b/.editorconfig @@ -12,7 +12,7 @@ indent_style = space tab_width = 4 # New line preferences -end_of_line = crlf +# end_of_line = crlf insert_final_newline = false #### .NET Coding Conventions #### @@ -58,7 +58,7 @@ dotnet_style_prefer_is_null_check_over_reference_equality_method = true:error dotnet_style_readonly_field = true:error # Parameter preferences -dotnet_code_quality_unused_parameters = all:error +dotnet_code_quality_unused_parameters = all:warning #### C# Coding Conventions #### @@ -68,14 +68,14 @@ csharp_style_var_for_built_in_types = true:error csharp_style_var_when_type_is_apparent = true:error # Expression-bodied members -csharp_style_expression_bodied_accessors = true:error -csharp_style_expression_bodied_constructors = true:error -csharp_style_expression_bodied_indexers = true:error -csharp_style_expression_bodied_lambdas = true:error -csharp_style_expression_bodied_local_functions = true:error -csharp_style_expression_bodied_methods = true:error -csharp_style_expression_bodied_operators = true:error -csharp_style_expression_bodied_properties = true:error +csharp_style_expression_bodied_accessors =true:warning +csharp_style_expression_bodied_constructors =true:warning +csharp_style_expression_bodied_indexers =true:warning +csharp_style_expression_bodied_lambdas =true:warning +csharp_style_expression_bodied_local_functions =true:warning +csharp_style_expression_bodied_methods =true:warning +csharp_style_expression_bodied_operators =true:warning +csharp_style_expression_bodied_properties =true:warning # Pattern matching preferences csharp_style_pattern_matching_over_as_with_null_check = true:error @@ -101,7 +101,7 @@ csharp_style_pattern_local_over_anonymous_function = true:error csharp_style_prefer_index_operator = true:warning csharp_style_prefer_range_operator = true:warning csharp_style_throw_expression = true:error -csharp_style_unused_value_assignment_preference = discard_variable:error +csharp_style_unused_value_assignment_preference =discard_variable:warning csharp_style_unused_value_expression_statement_preference = discard_variable:error # 'using' directive preferences diff --git a/.gitattributes b/.gitattributes index 1ff0c4230..b72c2c601 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,7 +1,7 @@ ############################################################################### # Set default behavior to automatically normalize line endings. ############################################################################### -* text=auto +* text eol=lf ############################################################################### # Set default behavior for command prompt diff. diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index a6013e986..74c171c6f 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -10,20 +10,21 @@ jobs: - name: Check out repository uses: actions/checkout@v2 - name: Setup .NET Core - uses: actions/setup-dotnet@v1.7.2 + uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.100-preview.2.21155.3' + dotnet-version: '6.0.x' + include-prerelease: true - name: Test source generator - run: dotnet test ./NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj + run: dotnet test ./NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj - name: Build solution run: dotnet build - name: Tests and coverage - run: dotnet test ./NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj -f:net6.0 -p:CollectCoverage=true -p:CoverletOutputFormat=lcov -p:CoverletOutput=TestResults/ + run: dotnet test ./NetFabric.Hyperlinq.Core.UnitTests/NetFabric.Hyperlinq.Core.UnitTests.csproj -f:net6.0 -p:CollectCoverage=true -p:CoverletOutputFormat=lcov -p:CoverletOutput=TestResults/ - name: Publish coverage report to coveralls.io uses: coverallsapp/github-action@master with: github-token: ${{ secrets.GITHUB_TOKEN }} - path-to-lcov: ./NetFabric.Hyperlinq.UnitTests/TestResults/coverage.net6.0.info + path-to-lcov: ./NetFabric.Hyperlinq.Core.UnitTests/TestResults/coverage.net6.0.info diff --git a/Icon.png b/Icon.png index 278ddc671..baf66818c 100644 Binary files a/Icon.png and b/Icon.png differ diff --git a/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj b/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj index c34ffc150..88176afb2 100644 --- a/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj +++ b/NetFabric.Hyperlinq.Benchmarks/NetFabric.Hyperlinq.Benchmarks.csproj @@ -3,18 +3,13 @@ Exe net6.0 false - true - - - - AnyCPU - pdbonly - true + Release + false - + diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Count/Count.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/Count.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Count/CountAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/CountAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Count/CountAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Count/CountAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Sum.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Sum.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/Sum.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/Sum.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/SumAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/SumAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Aggregation/Sum/SumAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Aggregation/Sum/SumAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Dictionary.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Dictionary.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Dictionary.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Dictionary.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSet.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSet.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSet.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSet.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/List.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/List.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/List.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/List.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueue.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueue.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueue.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueue.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Queue.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Queue.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Queue.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Queue.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionary.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionary.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionary.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionary.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSet.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSet.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSet.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSet.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Stack.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Stack.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Stack.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/Stack.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArray.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArray.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArray.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArray.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionary.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionary.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionary.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionary.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSet.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSet.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSet.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSet.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueue.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueue.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueue.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueue.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionary.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionary.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionary.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionary.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStack.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStack.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStack.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStack.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ArrayBuilder.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ArrayBuilder.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ArrayBuilder.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ArrayBuilder.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/LargeArrayBuilder.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/LargeArrayBuilder.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/LargeArrayBuilder.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/LargeArrayBuilder.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArray.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArray.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToList.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToList.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToListAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToListAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Conversion/ToList/ToListAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Conversion/ToList/ToListAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAt.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAt.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/First/First.ReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/First/First.ReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/First/First.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/First/First.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/First/First.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/First/First.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/First/First.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/First/First.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/First/First.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/First/FirstAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/First/FirstAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/First/FirstAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/First/FirstAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/Single/Single.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/Single/Single.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Element/Single/SingleAsync.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Element/Single/SingleAsync.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Element/Single/SingleAsync.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Element/Single/SingleAsync.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/Where/Where.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/Where/Where.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereAt/WhereAt.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereAt/WhereAt.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Filtering/WhereSelect/WhereSelect.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Filtering/WhereSelect/WhereSelect.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Empty.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Empty.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Empty.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Empty.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Range.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Range.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Range.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Range.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Repeat.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Repeat.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Repeat.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Repeat.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Return.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Return.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/AsyncValueEnumerable/Return.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/AsyncValueEnumerable/Return.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/Range.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/Range.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/Range.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/Range.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/Repeat.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/Repeat.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/Repeat.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/Repeat.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/Return.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/Return.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/Return.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/Return.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Empty.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Empty.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Empty.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Empty.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Range.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Range.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Range.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Range.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Repeat.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Repeat.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Repeat.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Repeat.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Return.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Return.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Generation/ValueEnumerable/Return.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Generation/ValueEnumerable/Return.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/GlobalSuppressions.cs b/NetFabric.Hyperlinq.Core.UnitTests/GlobalSuppressions.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/GlobalSuppressions.cs rename to NetFabric.Hyperlinq.Core.UnitTests/GlobalSuppressions.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj b/NetFabric.Hyperlinq.Core.UnitTests/NetFabric.Hyperlinq.Core.UnitTests.csproj similarity index 53% rename from NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj rename to NetFabric.Hyperlinq.Core.UnitTests/NetFabric.Hyperlinq.Core.UnitTests.csproj index 6e60efb64..d7c4ddcb2 100644 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj +++ b/NetFabric.Hyperlinq.Core.UnitTests/NetFabric.Hyperlinq.Core.UnitTests.csproj @@ -1,34 +1,36 @@  - net6.0 - + net48;netcoreapp2.1;netcoreapp3.1;net6.0 false - + - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - - - runtime; build; native; contentfiles; analyzers; buildtransitive + all - - runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + all + runtime; build; native; contentfiles; analyzers - + - - Always - + diff --git a/NetFabric.Hyperlinq.UnitTests/Option/Option.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Option/Option.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Option/Option.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Option/Option.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Option/TestData.Option.cs b/NetFabric.Hyperlinq.Core.UnitTests/Option/TestData.Option.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Option/TestData.Option.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Option/TestData.Option.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Skip.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Skip.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Skip/Skip.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/SkipTake.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/SkipTake.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/SkipTake.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/SkipTake.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Take.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Take.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Partitioning/Take/Take.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Partitioning/Take/Take.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/Select/Select.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/Select/Select.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyList.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyList.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyList.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectAt/SelectAt.ValueReadOnlyList.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectVector.TestData.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectVector.TestData.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectVector.TestData.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectVector.TestData.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Projection/SelectVector/SelectVector.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectVector/SelectVector.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Projection/SelectVector/SelectVector.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Projection/SelectVector/SelectVector.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/All/All.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/All/All.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Any/Any.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Any/Any.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ValueReadOnlyCollection.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ValueReadOnlyCollection.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/Contains/Contains.ValueReadOnlyCollection.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/Contains/Contains.ValueReadOnlyCollection.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ArraySegment.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ArraySegment.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ArraySegment.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ArraySegment.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.AsyncValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.AsyncValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.AsyncValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.AsyncValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ReadOnlyMemory.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ReadOnlyMemory.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ReadOnlyMemory.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ReadOnlyMemory.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ReadOnlySpan.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ReadOnlySpan.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ReadOnlySpan.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ReadOnlySpan.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ValueEnumerable.Tests.cs b/NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ValueEnumerable.Tests.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Set/Distinct/Distinct.ValueEnumerable.Tests.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Set/Distinct/Distinct.ValueEnumerable.Tests.cs diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/TestData.Empty.cs b/NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Empty.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/TestData/TestData.Empty.cs rename to NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Empty.cs diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/TestData.Multiple.cs b/NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Multiple.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/TestData/TestData.Multiple.cs rename to NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Multiple.cs diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/TestData.Single.cs b/NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Single.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/TestData/TestData.Single.cs rename to NetFabric.Hyperlinq.Core.UnitTests/TestData/TestData.Single.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/DelegateExtensions.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/DelegateExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/DelegateExtensions.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/DelegateExtensions.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/SpanExtensions.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/SpanExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/SpanExtensions.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/SpanExtensions.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/TestComparer.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/TestComparer.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/TestComparer.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/TestComparer.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs similarity index 77% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs index 8579095be..027b9b9ad 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncEnumerable.cs @@ -28,11 +28,7 @@ public AsyncEnumerator GetAsyncEnumerator() IAsyncEnumerator IAsyncEnumerable.GetAsyncEnumerator(CancellationToken _) // ReSharper disable once HeapView.BoxingAllocation => new AsyncEnumerator(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public AsyncEnumerableExtensions.AsyncValueEnumerable, AsyncEnumerator, AsyncEnumerator, T, GetAsyncEnumeratorFunction, GetAsyncEnumeratorFunction> AsAsyncValueEnumerable() - => this.AsAsyncValueEnumerable, AsyncEnumerator, T, GetAsyncEnumeratorFunction>(); - + public readonly struct GetAsyncEnumeratorFunction : IFunction, CancellationToken, AsyncEnumerator> { diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs similarity index 78% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs index cd44977d7..08841b05f 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsAsyncValueEnumerable.cs @@ -31,10 +31,6 @@ AsyncEnumerator IAsyncValueEnumerable>.GetAsyncEnumerat IAsyncEnumerator IAsyncEnumerable.GetAsyncEnumerator(CancellationToken _) // ReSharper disable once HeapView.BoxingAllocation => new AsyncEnumerator(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public AsyncValueEnumerableExtensions.AsyncValueEnumerable, AsyncEnumerator, AsyncEnumerator, T, GetAsyncEnumeratorFunction, GetAsyncEnumeratorFunction> AsAsyncValueEnumerable() - => AsyncValueEnumerableExtensions.AsAsyncValueEnumerable, AsyncEnumerator, T, GetAsyncEnumeratorFunction>(this); public readonly struct GetAsyncEnumeratorFunction : IFunction, CancellationToken, AsyncEnumerator> diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsCollection.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsCollection.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsCollection.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsCollection.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs similarity index 81% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs index 088e62d28..bb738371e 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsEnumerable.cs @@ -31,10 +31,6 @@ IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator() // ReSharper disable once HeapView.BoxingAllocation => GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public EnumerableExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => this.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(); public readonly struct GetEnumeratorFunction : IFunction, Enumerator> diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsFunctionIn.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsFunctionIn.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsFunctionIn.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsFunctionIn.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsList.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsList.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsList.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsList.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs similarity index 55% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs index 8d006b69c..bcb16a3ed 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyCollection.cs @@ -24,16 +24,6 @@ public ReadOnlyCollectionWrapper(T[] source) public int Count => source.Length; - - public new ReadOnlyCollectionExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ReadOnlyCollectionExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); - - public new readonly struct GetEnumeratorFunction - : IFunction, Enumerator> - { - public Enumerator Invoke(ReadOnlyCollectionWrapper enumerable) - => enumerable.GetEnumerator(); - } } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs similarity index 81% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs index c8218969f..1948c72dd 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsReadOnlyList.cs @@ -24,9 +24,6 @@ internal ReadOnlyListWrapper(T[] source) public T this[int index] => source[index]; - - public new ReadOnlyListExtensions.ValueEnumerable, T> AsValueEnumerable() - => this.AsValueEnumerable, T>(); } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs similarity index 69% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs index d09834452..05cdb1dcd 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueCollection.cs @@ -51,18 +51,6 @@ bool ICollection.Remove(T item) => throw new NotSupportedException(); void ICollection.Clear() => throw new NotSupportedException(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyCollectionExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ValueReadOnlyCollectionExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); - - public readonly struct GetEnumeratorFunction - : IFunction, Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator Invoke(ValueCollectionWrapper enumerable) - => enumerable.GetEnumerator(); - } } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs similarity index 79% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs index efa262bde..63dff6ba2 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueEnumerable.cs @@ -32,10 +32,6 @@ IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator() // ReSharper disable once HeapView.BoxingAllocation => GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ValueEnumerableExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); public readonly struct GetEnumeratorFunction : IFunction, Enumerator> diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs similarity index 75% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs index ef1f3889b..4033031c9 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueList.cs @@ -68,18 +68,6 @@ void IList.Insert(int index, T item) => throw new NotSupportedException(); void IList.RemoveAt(int index) => throw new NotSupportedException(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ValueReadOnlyListExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); - - public readonly struct GetEnumeratorFunction - : IFunction, Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator Invoke(ValueListWrapper enumerable) - => enumerable.GetEnumerator(); - } } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs similarity index 60% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs index 26ff0ffbc..8128eead9 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyCollection.cs @@ -35,18 +35,6 @@ IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator() // ReSharper disable once HeapView.BoxingAllocation => GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ReadOnlyCollectionExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ReadOnlyCollectionExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); - - public readonly struct GetEnumeratorFunction - : IFunction, Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator Invoke(ValueReadOnlyCollectionWrapper enumerable) - => enumerable.GetEnumerator(); - } } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs similarity index 62% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs index 8882b862e..f4b6c386c 100644 --- a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsValueReadOnlyList.cs @@ -38,18 +38,6 @@ IEnumerator IEnumerable.GetEnumerator() IEnumerator IEnumerable.GetEnumerator() // ReSharper disable once HeapView.BoxingAllocation => GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.ValueEnumerable, Enumerator, Enumerator, T, GetEnumeratorFunction, GetEnumeratorFunction> AsValueEnumerable() - => ValueReadOnlyListExtensions.AsValueEnumerable, Enumerator, T, GetEnumeratorFunction>(this); - - public readonly struct GetEnumeratorFunction - : IFunction, Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator Invoke(ValueReadOnlyListWrapper enumerable) - => enumerable.GetEnumerator(); - } } } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsyncEnumerator.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsyncEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.AsyncEnumerator.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.AsyncEnumerator.cs diff --git a/NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.Enumerator.cs b/NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.Enumerator.cs similarity index 100% rename from NetFabric.Hyperlinq.UnitTests/Utils/Wrappers/Wrap.Enumerator.cs rename to NetFabric.Hyperlinq.Core.UnitTests/Utils/Wrappers/Wrap.Enumerator.cs diff --git a/NetFabric.Hyperlinq/Aggregation/Count/Count.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ReadOnlySpan.cs similarity index 68% rename from NetFabric.Hyperlinq/Aggregation/Count/Count.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ReadOnlySpan.cs index 72c8dc7a5..f2470d7bf 100644 --- a/NetFabric.Hyperlinq/Aggregation/Count/Count.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ReadOnlySpan.cs @@ -6,14 +6,14 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { [MethodImpl(MethodImplOptions.AggressiveInlining)] - static int Count(this ReadOnlySpan source) + public static int Count(ReadOnlySpan source) => source.Length; [MethodImpl(MethodImplOptions.AggressiveInlining)] - static int Count(this ReadOnlySpan source, Func predicate) + public static int Count(ReadOnlySpan source, Func predicate) => source.Count(new FunctionWrapper(predicate)); - static int Count(this ReadOnlySpan source, TPredicate predicate = default) + public static int Count(this ReadOnlySpan source, TPredicate predicate = default) where TPredicate: struct, IFunction { var counter = 0; @@ -25,10 +25,10 @@ static int Count(this ReadOnlySpan source, TPredic } [MethodImpl(MethodImplOptions.AggressiveInlining)] - static int Count(this ReadOnlySpan source, Func predicate) + public static int Count(this ReadOnlySpan source, Func predicate) => source.CountAt(new FunctionWrapper(predicate)); - static int CountAt(this ReadOnlySpan source, TPredicate predicate = default) + public static int CountAt(this ReadOnlySpan source, TPredicate predicate = default) where TPredicate: struct, IFunction { var counter = 0; diff --git a/NetFabric.Hyperlinq/Aggregation/Count/Count.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueEnumerable.cs similarity index 68% rename from NetFabric.Hyperlinq/Aggregation/Count/Count.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueEnumerable.cs index f7eef5479..4e033636d 100644 --- a/NetFabric.Hyperlinq/Aggregation/Count/Count.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueEnumerable.cs @@ -20,12 +20,6 @@ public static int Count(this TEnumerable sour return counter; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.Count>(new FunctionWrapper(predicate)); - public static int Count(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -40,12 +34,6 @@ public static int Count(this TEnu } return counter; } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.CountAt>(new FunctionWrapper(predicate)); public static int CountAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Aggregation/Count/Count.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyCollection.cs similarity index 64% rename from NetFabric.Hyperlinq/Aggregation/Count/Count.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyCollection.cs index 0dd554836..6481d6078 100644 --- a/NetFabric.Hyperlinq/Aggregation/Count/Count.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyCollection.cs @@ -6,17 +6,12 @@ namespace NetFabric.Hyperlinq { public static partial class ValueReadOnlyCollectionExtensions { + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this TEnumerable source) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator => source.Count; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => Count>(source, new FunctionWrapper(predicate)); - public static int Count(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -26,12 +21,6 @@ public static int Count(this TEnu {Count: 0} => 0, _ => ValueEnumerableExtensions.Count(source, predicate) }; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => CountAt>(source, new FunctionWrapper(predicate)); public static int CountAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyList.cs new file mode 100644 index 000000000..11f843b7c --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Aggregation/Count/Count.ValueReadOnlyList.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Count(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Count(source); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Count(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate: struct, IFunction + => ValueReadOnlyCollectionExtensions.Count(source, predicate); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int CountAt(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate: struct, IFunction + => ValueReadOnlyCollectionExtensions.CountAt(source, predicate); + + } +} + diff --git a/NetFabric.Hyperlinq/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs similarity index 73% rename from NetFabric.Hyperlinq/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs index 152bad6f5..efa84676e 100644 --- a/NetFabric.Hyperlinq/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Count/CountAsync.AsyncValueEnumerable.cs @@ -29,12 +29,6 @@ public static async ValueTask CountAsync return counter; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueTask CountAsync(this TEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.CountAsync>(new AsyncFunctionWrapper(predicate), cancellationToken); - public static async ValueTask CountAsync(this TEnumerable source, TPredicate predicate = default, CancellationToken cancellationToken = default) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -60,12 +54,6 @@ public static async ValueTask CountAsync CountAsync(this TEnumerable source, Func> predicate, CancellationToken cancellationToken = default) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.CountAtAsync>(new AsyncFunctionWrapper(predicate), cancellationToken); - public static async ValueTask CountAtAsync(this TEnumerable source, TPredicate predicate = default, CancellationToken cancellationToken = default) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.Range.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.Range.cs similarity index 97% rename from NetFabric.Hyperlinq/Aggregation/Sum/Sum.Range.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.Range.cs index 389af6bed..3ca8d9949 100644 --- a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.Range.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.Range.cs @@ -10,9 +10,7 @@ public static partial class ValueEnumerable static int SumRange(int start, int count) => count * (start + start + count) / 2; - [GeneratorIgnore] [MethodImpl(MethodImplOptions.AggressiveInlining)] - [SkipLocalsInit] static unsafe TResult SumRange(int start, int count, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ReadOnlySpan.cs similarity index 97% rename from NetFabric.Hyperlinq/Aggregation/Sum/Sum.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ReadOnlySpan.cs index 197420b85..d3e87fe90 100644 --- a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ReadOnlySpan.cs @@ -6,7 +6,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorIgnore] + static TSum Sum(this ReadOnlySpan source) where TSum : struct { @@ -26,7 +26,7 @@ static TSum Sum(this ReadOnlySpan source) return Scalar.Add(sum0, sum1); } - [GeneratorIgnore] + static TSum SumVector(this ReadOnlySpan source) where TSource : struct where TSum : struct @@ -44,7 +44,7 @@ static TSum SumVector(this ReadOnlySpan source) return Scalar.Add(vectorSum.Sum(), Sum(source.Slice(source.Length - count, count))); } - [GeneratorIgnore] + static TSum Sum(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction where TSum : struct @@ -66,7 +66,7 @@ static TSum Sum(this ReadOnlySpan source, TP return Scalar.Add(sum0, sum1); } - [GeneratorIgnore] + static TSum SumAt(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction where TSum : struct @@ -89,7 +89,7 @@ static TSum SumAt(this ReadOnlySpan source, return Scalar.Add(sum0, sum1); } - [GeneratorIgnore] + static TSum Sum(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction where TSum : struct @@ -110,7 +110,7 @@ static TSum Sum(this ReadOnlySpan so return Scalar.Add(sum0, sum1); } - [GeneratorIgnore] + static TSum SumVector(this ReadOnlySpan source, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> where TSelector : struct, IFunction @@ -131,7 +131,7 @@ static TSum SumVector(this R return Scalar.Add(vectorSum.Sum(), Sum(source.Slice(source.Length - count, count), selector)); } - [GeneratorIgnore] + static TSum SumAt(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction where TSum : struct @@ -153,7 +153,7 @@ static TSum SumAt(this ReadOnlySpan return Scalar.Add(sum0, sum1); } - [GeneratorIgnore] + static TSum Sum(this ReadOnlySpan source, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueEnumerable.cs similarity index 94% rename from NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueEnumerable.cs index 1cc64d0c4..29ab70c16 100644 --- a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueEnumerable.cs @@ -4,8 +4,8 @@ namespace NetFabric.Hyperlinq { public static partial class ValueEnumerableExtensions { - [GeneratorIgnore] - internal static TSum Sum(this TEnumerable source) + + public static TSum Sum(this TEnumerable source) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator where TSum : struct @@ -17,7 +17,7 @@ internal static TSum Sum(this TEnumerab return sum; } - [GeneratorIgnore] + internal static TSum Sum(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -34,7 +34,7 @@ internal static TSum Sum(th return sum; } - [GeneratorIgnore] + internal static TSum SumAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -51,7 +51,7 @@ internal static TSum SumAt( return sum; } - [GeneratorIgnore] + internal static TSum Sum(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -68,7 +68,7 @@ internal static TSum Sum(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -85,7 +85,7 @@ internal static TSum SumAt(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs similarity index 93% rename from NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs index be0c80100..18b1702ee 100644 --- a/NetFabric.Hyperlinq/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyCollection.cs @@ -4,8 +4,8 @@ namespace NetFabric.Hyperlinq { public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorIgnore] - internal static TSum Sum(this TEnumerable source) + + public static TSum Sum(this TEnumerable source) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator where TSum : struct @@ -15,7 +15,7 @@ internal static TSum Sum(this TEnumerab _ => ValueEnumerableExtensions.Sum(source) }; - [GeneratorIgnore] + static TSum Sum(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -27,7 +27,7 @@ static TSum Sum(this TEnume _ => ValueEnumerableExtensions.Sum(source, predicate) }; - [GeneratorIgnore] + static TSum SumAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -39,7 +39,7 @@ static TSum SumAt(this TEnu _ => ValueEnumerableExtensions.SumAt(source, predicate) }; - [GeneratorIgnore] + internal static TSum Sum(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -51,7 +51,7 @@ internal static TSum Sum ValueEnumerableExtensions.Sum(source, selector) }; - [GeneratorIgnore] + internal static TSum SumAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -63,7 +63,7 @@ internal static TSum SumAt ValueEnumerableExtensions.SumAt(source, selector) }; - [GeneratorIgnore] + static TSum Sum(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyList.cs new file mode 100644 index 000000000..3df49ac22 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/Sum.ValueReadOnlyList.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TSum Sum(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TSum : struct + => ValueReadOnlyCollectionExtensions.Sum(source); + } +} + diff --git a/NetFabric.Hyperlinq/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs index 7727606b0..442427cd2 100644 --- a/NetFabric.Hyperlinq/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Aggregation/Sum/SumAsync.AsyncValueEnumerable.cs @@ -6,7 +6,7 @@ namespace NetFabric.Hyperlinq { public static partial class AsyncValueEnumerableExtensions { - [GeneratorIgnore] + public static async ValueTask SumAsync(this TEnumerable source, CancellationToken cancellationToken = default) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -26,7 +26,7 @@ public static async ValueTask SumAsync SumAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -51,7 +51,7 @@ internal static async ValueTask SumAsync SumAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -76,7 +76,7 @@ internal static async ValueTask SumAtAsync SumAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -100,7 +100,7 @@ internal static async ValueTask SumAsync SumAtAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -124,7 +124,7 @@ internal static async ValueTask SumAtAsync SumAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncEnumerable/AsAsyncEnumerable.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncEnumerable.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs index 09046a183..b0b7bffb5 100644 --- a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'1.AsyncValueEnumerable.cs @@ -14,7 +14,6 @@ public static AsyncValueEnumerable AsAsyncValueEnumerable< where TEnumerator : struct, IAsyncEnumerator => new(source); - [GeneratorBindings(source: "source", sourceImplements: "IAsyncValueEnumerable`2", enumerableType: "IAsyncValueEnumerable")] [StructLayout(LayoutKind.Auto)] public readonly partial struct AsyncValueEnumerable : IAsyncValueEnumerable diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs similarity index 99% rename from NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs index ea9b2f9c8..f418e35d8 100644 --- a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncEnumerable.cs @@ -11,14 +11,14 @@ namespace NetFabric.Hyperlinq public static partial class AsyncEnumerableExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable, FunctionWrapper> AsAsyncValueEnumerable(this TEnumerable source, Func getAsyncEnumerator) where TEnumerable : IAsyncEnumerable where TEnumerator : struct, IAsyncEnumerator => AsAsyncValueEnumerable>(source, new FunctionWrapper(getAsyncEnumerator)); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable AsAsyncValueEnumerable(this TEnumerable source, TGetAsyncEnumerator getAsyncEnumerator = default) where TEnumerable : IAsyncEnumerable @@ -26,7 +26,7 @@ public static AsyncValueEnumerable => new(source, getAsyncEnumerator, getAsyncEnumerator); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable, FunctionWrapper> AsAsyncValueEnumerable(this TEnumerable source, Func getAsyncEnumerator, Func getAsyncEnumerator2) where TEnumerable : IAsyncEnumerable @@ -34,7 +34,7 @@ public static AsyncValueEnumerable AsAsyncValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getAsyncEnumerator), new FunctionWrapper(getAsyncEnumerator2)); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable AsAsyncValueEnumerable(this TEnumerable source, TGetAsyncEnumerator getAsyncEnumerator = default, TGetAsyncEnumerator2 getAsyncEnumerator2 = default) where TEnumerable : IAsyncEnumerable @@ -54,8 +54,10 @@ public partial struct AsyncValueEnumerable { readonly TEnumerable source; +#pragma warning disable IDE0044 // Add readonly modifier TGetAsyncEnumerator getAsyncEnumerator; TGetAsyncEnumerator2 getAsyncEnumerator2; +#pragma warning restore IDE0044 // Add readonly modifier internal AsyncValueEnumerable(TEnumerable source, TGetAsyncEnumerator getAsyncEnumerator, TGetAsyncEnumerator2 getAsyncEnumerator2) => (this.source, this.getAsyncEnumerator, this.getAsyncEnumerator2) = (source, getAsyncEnumerator, getAsyncEnumerator2); diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs index 7fc40740b..c54d790ba 100644 --- a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsAsyncValueEnumerable'6.AsyncValueEnumerable.cs @@ -10,14 +10,14 @@ namespace NetFabric.Hyperlinq public static partial class AsyncValueEnumerableExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable, FunctionWrapper> AsAsyncValueEnumerable(this TEnumerable source, Func getAsyncEnumerator) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator => AsAsyncValueEnumerable>(source, new FunctionWrapper(getAsyncEnumerator)); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable AsAsyncValueEnumerable(this TEnumerable source, TGetAsyncEnumerator getAsyncEnumerator = default) where TEnumerable : IAsyncValueEnumerable @@ -25,7 +25,7 @@ public static AsyncValueEnumerable => new(source, getAsyncEnumerator, getAsyncEnumerator); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable, FunctionWrapper> AsAsyncValueEnumerable(this TEnumerable source, Func getAsyncEnumerator, Func getAsyncEnumerator2) where TEnumerable : IAsyncValueEnumerable @@ -33,7 +33,7 @@ public static AsyncValueEnumerable AsAsyncValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getAsyncEnumerator), new FunctionWrapper(getAsyncEnumerator2)); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static AsyncValueEnumerable AsAsyncValueEnumerable(this TEnumerable source, TGetAsyncEnumerator getAsyncEnumerator = default, TGetAsyncEnumerator2 getAsyncEnumerator2 = default) where TEnumerable : IAsyncValueEnumerable @@ -43,7 +43,6 @@ public static AsyncValueEnumerable => new(source, getAsyncEnumerator, getAsyncEnumerator2); - [GeneratorBindings(source: "source", sourceImplements: "IAsyncValueEnumerable`2")] [StructLayout(LayoutKind.Auto)] public partial struct AsyncValueEnumerable : IAsyncValueEnumerable diff --git a/NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsyncValueEnumerator.cs b/NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsyncValueEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsAsyncValueEnumerable/AsyncValueEnumerator.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsAsyncValueEnumerable/AsyncValueEnumerator.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsEnumerable/AsEnumerable.ValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs similarity index 93% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs index b9cd3a2dc..318d761c2 100644 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Array.cs @@ -6,7 +6,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ArraySegmentValueEnumerable AsValueEnumerable(this TSource[] source) => new(new ArraySegment(source)); diff --git a/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs new file mode 100644 index 000000000..c39e49457 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs @@ -0,0 +1,240 @@ +using System; +using System.Buffers; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ArrayExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ArraySegmentValueEnumerable AsValueEnumerable(this ArraySegment source) + => new(source); + + [StructLayout(LayoutKind.Auto)] + public readonly partial struct ArraySegmentValueEnumerable + : IValueReadOnlyList.DisposableEnumerator> + , IList + { + internal readonly ArraySegment source; + + internal ArraySegmentValueEnumerable(ArraySegment source) + => this.source = source; + + public int Count + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source.Count; + } + + public TSource this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + ThrowIfArgument.OutOfRange(index, Count, nameof(index)); + return source.Array![source.Offset + index]; + } + } + + TSource IList.this[int index] + { + get => this[index]; + + [ExcludeFromCodeCoverage] + // ReSharper disable once ValueParameterNotUsed + set => Throw.NotSupportedException(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public SpanEnumerator GetEnumerator() + => new(source); + + DisposableEnumerator IValueEnumerable.GetEnumerator() + => new(source); + + IEnumerator IEnumerable.GetEnumerator() + // ReSharper disable once HeapView.BoxingAllocation + => new DisposableEnumerator(source); + + IEnumerator IEnumerable.GetEnumerator() + // ReSharper disable once HeapView.BoxingAllocation + => new DisposableEnumerator(source); + + + bool ICollection.IsReadOnly + => true; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CopyTo(Span span) + => source.AsReadOnlySpan().CopyTo(span); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CopyTo(TSource[] array, int arrayIndex) + => ((ICollection)source).CopyTo(array, arrayIndex); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(TSource item) + => ((ICollection)source).Contains(item); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int IndexOf(TSource item) + => ((IList)source).IndexOf(item); + + [ExcludeFromCodeCoverage] + void ICollection.Add(TSource item) + => Throw.NotSupportedException(); + [ExcludeFromCodeCoverage] + bool ICollection.Remove(TSource item) + => Throw.NotSupportedException(); + [ExcludeFromCodeCoverage] + void ICollection.Clear() + => Throw.NotSupportedException(); + + [ExcludeFromCodeCoverage] + void IList.Insert(int index, TSource item) + => Throw.NotSupportedException(); + + [ExcludeFromCodeCoverage] + void IList.RemoveAt(int index) + => Throw.NotSupportedException(); + + [StructLayout(LayoutKind.Auto)] + public struct DisposableEnumerator + : IEnumerator + { + readonly ArraySegment source; + int index; + + internal DisposableEnumerator(ArraySegment source) + { + this.source = source; + index = -1; + } + + public readonly TSource Current + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source.Array![source.Offset + index]; + } + readonly object? IEnumerator.Current + // ReSharper disable once HeapView.PossibleBoxingAllocation + => Current; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool MoveNext() + => ++index < source.Count; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [ExcludeFromCodeCoverage] + public void Reset() + => index = -1; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public readonly void Dispose() { } + } + + #region Partitioning + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ArraySegmentValueEnumerable Skip(int count) + { + var (newOffset, newCount) = Utils.Skip(source.Count, count); + return new ArraySegmentValueEnumerable(new ArraySegment(source.Array!, source.Offset + newOffset, newCount)); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ArraySegmentValueEnumerable Take(int count) + => new(new ArraySegment(source.Array!, source.Offset, Utils.Take(source.Count, count))); + + #endregion + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static nint Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static nint Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static nuint Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static nuint Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static long Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static long Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static double Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().SumVector(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static double Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static decimal Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static decimal Sum(this ArraySegmentValueEnumerable source) + => source.source.AsReadOnlySpan().Sum(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool ContainsVector(this ArraySegmentValueEnumerable source, TSource value) + where TSource : struct + => source.source.AsReadOnlySpan().ContainsVector(value); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SpanSelectVectorContext, Vector>, FunctionWrapper> SelectVector(this ArraySegmentValueEnumerable source, Func, Vector> vectorSelector, Func selector) + where TSource : struct + where TResult : struct + => source.source.AsReadOnlySpan().SelectVector(vectorSelector, selector); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SpanSelectVectorContext SelectVector(this ArraySegmentValueEnumerable source, TSelector selector = default) + where TSelector : struct, IFunction, Vector>, IFunction + where TSource : struct + where TResult : struct + => source.source.AsReadOnlySpan().SelectVector(selector, selector); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SpanSelectVectorContext SelectVector(this ArraySegmentValueEnumerable source, TVectorSelector vectorSelector = default, TSelector selector = default) + where TVectorSelector : struct, IFunction, Vector> + where TSelector : struct, IFunction + where TSource : struct + where TResult : struct + => source.source.AsReadOnlySpan().SelectVector(vectorSelector, selector); + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArrayExtensions.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ImmutableArray.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableArrayExtensions.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ImmutableArray.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/ListExtensions.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.List.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/ListExtensions.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.List.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs similarity index 76% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs index ce41542a3..7b25a3c4e 100644 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Memory.cs @@ -6,9 +6,8 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static MemoryValueEnumerable AsValueEnumerable(this Memory source) - => ((ReadOnlyMemory)source).AsValueEnumerable(); + => source.AsReadOnlyMemory().AsValueEnumerable(); } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs similarity index 91% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs index 621f02484..d58c7cf91 100644 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlyMemory.cs @@ -11,12 +11,11 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static MemoryValueEnumerable AsValueEnumerable(this ReadOnlyMemory source) => new(source); - [GeneratorBindings(source: "source.Span", sourceImplements: "ReadOnlySpan`1")] [StructLayout(LayoutKind.Auto)] public readonly partial struct MemoryValueEnumerable : IValueReadOnlyList.DisposableEnumerator> @@ -236,28 +235,6 @@ public MemoryDistinctEnumerable Distinct(IEqualityComparer? co #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemoryValueEnumerable source) - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemoryValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemoryValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemoryValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this MemoryValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.CountAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this MemoryValueEnumerable source) => source.source.Span.SumVector(); diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs similarity index 54% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs index 3d8b97c67..ac5a927cf 100644 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.ReadOnlySpan.cs @@ -10,12 +10,10 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SpanValueEnumerable AsValueEnumerable(this ReadOnlySpan source) => new(source); - [GeneratorBindings(source: "source", sourceImplements: "ReadOnlySpan`1")] [StructLayout(LayoutKind.Auto)] public readonly ref partial struct SpanValueEnumerable { @@ -24,6 +22,12 @@ public readonly ref partial struct SpanValueEnumerable internal SpanValueEnumerable(ReadOnlySpan source) => this.source = source; + public ReadOnlySpan Span + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source; + } + public int Count { [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -39,48 +43,6 @@ public TSource this[int index] [MethodImpl(MethodImplOptions.AggressiveInlining)] public SpanEnumerator GetEnumerator() => new(source); - - #region Aggregation - - #endregion - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanValueEnumerable AsEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanValueEnumerable AsValueEnumerable() - => this; - - #endregion - - #region Element - - #endregion - - #region Filtering - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanWhereEnumerable> Where(Func predicate) - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanWhereEnumerable Where(TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanWhereAtEnumerable> Where(Func predicate) - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanWhereAtEnumerable WhereAt(TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.WhereAt(predicate); - - #endregion #region Partitioning @@ -97,53 +59,6 @@ public SpanValueEnumerable Take(int count) #endregion - #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectEnumerable> Select(Func selector) - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectEnumerable Select(TSelector selector = default) - where TSelector : struct, IFunction - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectAtEnumerable> Select(Func selector) - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectAtEnumerable SelectAt(TSelector selector = default) - where TSelector : struct, IFunction - => source.SelectAt(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectManyEnumerable> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => source.SelectMany(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanSelectManyEnumerable SelectMany(TSelector selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.SelectMany(selector); - - #endregion - - #region Quantifier - - #endregion - - #region Set - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanDistinctEnumerable Distinct(IEqualityComparer? comparer = default) - => source.Distinct(comparer); - - #endregion - public bool SequenceEqual(IEnumerable other, IEqualityComparer? comparer = null) { comparer ??= EqualityComparer.Default; @@ -167,28 +82,6 @@ public bool SequenceEqual(IEnumerable other, IEqualityComparer } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanValueEnumerable source) - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this SpanValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.CountAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this SpanValueEnumerable source) => source.source.SumVector(); diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs similarity index 77% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs index 821f8da57..3384b4eac 100644 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/AsValueEnumerable.Span.cs @@ -6,9 +6,9 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SpanValueEnumerable AsValueEnumerable(this Span source) - => ((ReadOnlySpan)source).AsValueEnumerable(); + => source.AsReadOnlySpan().AsValueEnumerable(); } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/SpanEnumerator.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/SpanEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/SpanEnumerator.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/SpanEnumerator.cs diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/ValueEnumerator.cs b/NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/ValueEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Conversion/AsValueEnumerable/ValueEnumerator.cs rename to NetFabric.Hyperlinq.Core/Conversion/AsValueEnumerable/ValueEnumerator.cs diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ReadOnlySpan.cs similarity index 96% rename from NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ReadOnlySpan.cs index c7343d194..844bf3341 100644 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ReadOnlySpan.cs @@ -23,7 +23,6 @@ public static Lease ToArray(this ReadOnlySpan source, ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] static TSource[] ToArray(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -34,7 +33,6 @@ static TSource[] ToArray(this ReadOnlySpan source, return arrayBuilder.ToArray(); } - [GeneratorIgnore] static Lease ToArray(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TPredicate : struct, IFunction { @@ -48,7 +46,6 @@ static Lease ToArray(this ReadOnlySpan so ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] static TSource[] ToArrayAt(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -59,7 +56,6 @@ static TSource[] ToArrayAt(this ReadOnlySpan sourc return arrayBuilder.ToArray(); } - [GeneratorIgnore] static Lease ToArrayAt(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TPredicate : struct, IFunction { @@ -73,7 +69,6 @@ static Lease ToArrayAt(this ReadOnlySpan ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] static TResult[] ToArray(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction { @@ -85,7 +80,6 @@ static TResult[] ToArray(this ReadOnlySpan return result; } - [GeneratorIgnore] static TResult[] ToArrayVector(this ReadOnlySpan source, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> where TSelector : struct, IFunction @@ -100,7 +94,6 @@ static TResult[] ToArrayVector(thi return result; } - [GeneratorIgnore] static Lease ToArrayVector(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> where TSelector : struct, IFunction @@ -115,7 +108,6 @@ static Lease ToArrayVector ToArray(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TSelector : struct, IFunction { @@ -129,7 +121,6 @@ static Lease ToArray(this ReadOnlySpan(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction { @@ -141,7 +132,6 @@ static TResult[] ToArrayAt(this ReadOnlySpan ToArrayAt(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TSelector : struct, IFunction { @@ -156,7 +146,6 @@ static Lease ToArrayAt(this ReadOnlySpan(this ReadOnlySpan source, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction @@ -168,7 +157,6 @@ static TResult[] ToArray(this ReadOnlyS return arrayBuilder.ToArray(); } - [GeneratorIgnore] static Lease ToArray(this ReadOnlySpan source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueEnumerable.cs index 36108fba9..33ce977bc 100644 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueEnumerable.cs @@ -49,7 +49,6 @@ public static Lease ToArray(this TEn ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] internal static TSource[] ToArray(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -59,7 +58,6 @@ internal static TSource[] ToArray return arrayBuilder.ToArray(); } - [GeneratorIgnore] internal static Lease ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -72,7 +70,6 @@ internal static Lease ToArray(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -82,7 +79,6 @@ internal static TSource[] ToArrayAt ToArrayAt(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -95,7 +91,6 @@ internal static Lease ToArrayAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -105,7 +100,6 @@ static TResult[] ToArray( return arrayBuilder.ToArray(); } - [GeneratorIgnore] static Lease ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -117,7 +111,6 @@ static Lease ToArray(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -127,7 +120,6 @@ static TResult[] ToArrayAt ToArrayAt(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -139,8 +131,6 @@ static Lease ToArrayAt(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -151,7 +141,6 @@ internal static TResult[] ToArray ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -162,4 +151,4 @@ internal static Lease ToArray ToArray(this TEn ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] static TSource[] ToArray(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -52,7 +51,6 @@ static TSource[] ToArray(this TEn ? Array.Empty() : ValueEnumerableExtensions.ToArray(source, predicate); - [GeneratorIgnore] static Lease ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -63,7 +61,6 @@ static Lease ToArray(thi ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] static TSource[] ToArrayAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -72,7 +69,7 @@ static TSource[] ToArrayAt(this T ? Array.Empty() : ValueEnumerableExtensions.ToArrayAt(source, predicate); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Lease ToArrayAt(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -84,7 +81,6 @@ static Lease ToArrayAt(t ////////////////////////////////////////////////////////////////////////////////////////////////// - [GeneratorIgnore] internal static TResult[] ToArray(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -98,7 +94,6 @@ internal static TResult[] ToArray ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -115,7 +110,6 @@ internal static Lease ToArray(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -129,7 +123,6 @@ internal static TResult[] ToArrayAt ToArrayAt(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -145,7 +138,6 @@ internal static Lease ToArrayAt(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -155,7 +147,6 @@ static TResult[] ToArray() : ValueEnumerableExtensions.ToArray(source, predicate, selector); - [GeneratorIgnore] static Lease ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueReadOnlyList.cs new file mode 100644 index 000000000..1ea33e6da --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArray.ValueReadOnlyList.cs @@ -0,0 +1,24 @@ +using System; +using System.Buffers; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TSource[] ToArray(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.ToArray(source); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Lease ToArray(this TEnumerable source, ArrayPool pool, bool clearOnDispose = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.ToArray(source, pool, clearOnDispose); + } +} diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs index a062b1ec7..58bfebf82 100644 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToArray/ToArrayAsync.AsyncValueEnumerable.cs @@ -23,7 +23,7 @@ public static async ValueTask> ToArrayAsync ToArrayAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -31,7 +31,7 @@ static async ValueTask ToArrayAsync => (await source.ToArrayBuilderAsync(ArrayPool.Shared, false, cancellationToken, predicate).ConfigureAwait(false)).ToArray(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToArrayAsync(this TEnumerable source, ArrayPool pool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -41,7 +41,7 @@ static async ValueTask> ToArrayAsync ToArrayAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -49,7 +49,7 @@ static async ValueTask ToArrayAtAsync => (await source.ToArrayBuilderAtAsync(ArrayPool.Shared, false, cancellationToken, predicate).ConfigureAwait(false)).ToArray(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToArrayAtAsync(this TEnumerable source, ArrayPool pool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -59,7 +59,7 @@ static async ValueTask> ToArrayAtAsync ToArrayAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -67,7 +67,7 @@ static async ValueTask ToArrayAsync => (await source.ToArrayBuilderAsync(ArrayPool.Shared, false, cancellationToken, selector).ConfigureAwait(false)).ToArray(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToArrayAsync(this TEnumerable source, ArrayPool pool, CancellationToken cancellationToken, bool clearOnDispose, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -77,7 +77,7 @@ static async ValueTask> ToArrayAsync ToArrayAtAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -85,7 +85,7 @@ static async ValueTask ToArrayAtAsync => (await source.ToArrayBuilderAtAsync(ArrayPool.Shared, false, cancellationToken, selector).ConfigureAwait(false)).ToArray(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToArrayAtAsync(this TEnumerable source, ArrayPool pool, CancellationToken cancellationToken, bool clearOnDispose, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -95,7 +95,7 @@ static async ValueTask> ToArrayAtAsync ToArrayAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -104,7 +104,7 @@ static async ValueTask ToArrayAsync => (await source.ToArrayBuilderAsync(ArrayPool.Shared, false, cancellationToken, predicate, selector).ConfigureAwait(false)).ToArray(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToArrayAsync(this TEnumerable source, ArrayPool pool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable diff --git a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs similarity index 98% rename from NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs index 5631d82a0..a01acfc42 100644 --- a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ReadOnlySpan.cs @@ -24,7 +24,7 @@ static Dictionary ToDictionary(this return dictionary; } - [GeneratorIgnore] + static Dictionary ToDictionary(this ReadOnlySpan source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TKey : notnull where TKeySelector : struct, IFunction @@ -40,7 +40,7 @@ static Dictionary ToDictionary ToDictionaryAt(this ReadOnlySpan source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TKey : notnull where TKeySelector : struct, IFunction @@ -57,7 +57,7 @@ static Dictionary ToDictionaryAt ToDictionary(this ReadOnlySpan source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TKey : notnull where TKeySelector : struct, IFunction @@ -98,7 +98,7 @@ static Dictionary ToDictionary ToDictionary( this ReadOnlySpan source, TKeySelector keySelector, TElementSelector elementSelector, @@ -118,7 +118,7 @@ static Dictionary return dictionary; } - [GeneratorIgnore] + static Dictionary ToDictionaryAt( this ReadOnlySpan source, TKeySelector keySelector, TElementSelector elementSelector, @@ -140,7 +140,7 @@ static Dictionary return dictionary; } - [GeneratorIgnore] + static Dictionary ToDictionary(this ReadOnlySpan source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TKey : notnull where TKeySelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs similarity index 85% rename from NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs index 7bdd23b00..72e8f2c28 100644 --- a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueEnumerable.cs @@ -8,13 +8,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Dictionary ToDictionary(this TEnumerable source, Func keySelector, IEqualityComparer? comparer = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TKey : notnull - => source.ToDictionary>(new FunctionWrapper(keySelector), comparer); - public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -31,7 +24,7 @@ public static Dictionary ToDictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -51,7 +44,7 @@ internal static Dictionary ToDictionary ToDictionaryAt(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -73,7 +66,7 @@ internal static Dictionary ToDictionaryAt ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -98,13 +91,6 @@ internal static Dictionary ToDictionary ToDictionary(this TEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TKey : notnull - => source.ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -124,7 +110,7 @@ public static Dictionary ToDictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -144,7 +130,7 @@ internal static Dictionary ToDictionary ToDictionaryAt(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -167,7 +153,7 @@ internal static Dictionary ToDictionaryAt ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs similarity index 83% rename from NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs index 6d3eb4e85..da53b8cae 100644 --- a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyCollection.cs @@ -6,13 +6,6 @@ namespace NetFabric.Hyperlinq { public static partial class ValueReadOnlyCollectionExtensions { - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Dictionary ToDictionary(this TEnumerable source, Func keySelector, IEqualityComparer? comparer = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TKey : notnull - => ToDictionary>(source, new FunctionWrapper(keySelector), comparer); public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer = default) where TEnumerable : IValueReadOnlyCollection @@ -24,7 +17,7 @@ public static Dictionary ToDictionary() : ValueEnumerableExtensions.ToDictionary(source, keySelector, comparer); - [GeneratorIgnore] + static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -37,7 +30,7 @@ static Dictionary ToDictionary(source, keySelector, comparer, predicate); - [GeneratorIgnore] + static Dictionary ToDictionaryAt(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -49,7 +42,7 @@ static Dictionary ToDictionaryAt() : ValueEnumerableExtensions.ToDictionaryAt(source, keySelector, comparer, predicate); - [GeneratorIgnore] + static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -64,13 +57,6 @@ static Dictionary ToDictionary ToDictionary(this TEnumerable source, Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TKey : notnull - => ToDictionary, FunctionWrapper>(source, new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TEnumerable : IValueReadOnlyCollection @@ -84,7 +70,7 @@ public static Dictionary ToDictionary(source, keySelector, elementSelector, comparer); - [GeneratorIgnore] + static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -98,7 +84,7 @@ static Dictionary ToDictionary(source, keySelector, elementSelector, comparer, predicate); - [GeneratorIgnore] + static Dictionary ToDictionaryAt(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator @@ -111,7 +97,7 @@ static Dictionary ToDictionaryAt() : ValueEnumerableExtensions.ToDictionaryAt(source, keySelector, elementSelector, comparer, predicate); - [GeneratorIgnore] + static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyList.cs new file mode 100644 index 000000000..edac0afbb --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionary.ValueReadOnlyList.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, IEqualityComparer? comparer = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TKey : notnull + where TKeySelector : struct, IFunction + => ValueReadOnlyCollectionExtensions.ToDictionary(source, keySelector, comparer); + + ////////////////////////////////////////////////////////////////////////////////////////////////// + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Dictionary ToDictionary(this TEnumerable source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TKey : notnull + where TKeySelector : struct, IFunction + where TElementSelector : struct, IFunction + => ValueReadOnlyCollectionExtensions.ToDictionary(source, keySelector, elementSelector, comparer); + } +} + diff --git a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs similarity index 88% rename from NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs index 8dd683283..e098c5d12 100644 --- a/NetFabric.Hyperlinq/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToDictionary/ToDictionaryAsync.AsyncValueEnumerable.cs @@ -9,16 +9,6 @@ namespace NetFabric.Hyperlinq { public static partial class AsyncValueEnumerableExtensions { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueTask> ToDictionaryAsync( - this TEnumerable source, - Func> keySelector, - IEqualityComparer? comparer = default, - CancellationToken cancellationToken = default) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - where TKey : notnull - => source.ToDictionaryAsync>(new AsyncFunctionWrapper(keySelector), comparer, cancellationToken); public static ValueTask> ToDictionaryAsync( this TEnumerable source, @@ -58,7 +48,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAsync( this TEnumerable source, TKeySelector keySelector, @@ -93,7 +83,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAtAsync( this TEnumerable source, TKeySelector keySelector, @@ -131,7 +121,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAsync( this TEnumerable source, TKeySelector keySelector, @@ -172,18 +162,6 @@ static async ValueTask> ToDictionaryAsync> ToDictionaryAsync( - this TEnumerable source, - Func> keySelector, - Func> elementSelector, - IEqualityComparer? comparer = default, - CancellationToken cancellationToken = default) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - where TKey : notnull - => source.ToDictionaryAsync, AsyncFunctionWrapper>(new AsyncFunctionWrapper(keySelector), new AsyncFunctionWrapper(elementSelector), comparer, cancellationToken); - public static ValueTask> ToDictionaryAsync( this TEnumerable source, TKeySelector keySelector, @@ -223,7 +201,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAsync( this TEnumerable source, TKeySelector keySelector, @@ -260,7 +238,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAtAsync( this TEnumerable source, TKeySelector keySelector, @@ -300,7 +278,7 @@ await keySelector.InvokeAsync(item, cancellationToken).ConfigureAwait(false), } - [GeneratorIgnore] + static async ValueTask> ToDictionaryAsync( this TEnumerable source, TKeySelector keySelector, diff --git a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ReadOnlySpan.cs similarity index 94% rename from NetFabric.Hyperlinq/Conversion/ToList/ToList.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ReadOnlySpan.cs index ab86e865f..bb4f7dfb4 100644 --- a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ReadOnlySpan.cs @@ -13,25 +13,25 @@ public static partial class ArrayExtensions static List ToList(this ReadOnlySpan source) => source.ToArray().AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction => source.ToArray(predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListAt(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction => source.ToArrayAt(predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction => source.ToArray(selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListVector(this ReadOnlySpan source, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> @@ -40,13 +40,13 @@ static List ToListVector( where TResult : struct => source.ToArrayVector(vectorSelector, selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListAt(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction => source.ToArrayAt(selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this ReadOnlySpan source, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction diff --git a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueEnumerable.cs similarity index 96% rename from NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueEnumerable.cs index 9a42620e6..2b03337c3 100644 --- a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueEnumerable.cs @@ -14,7 +14,7 @@ public static List ToList(this TEnum => source.ToArray().AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable @@ -23,7 +23,7 @@ static List ToList(this => source.ToArray(predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable @@ -32,7 +32,7 @@ static List ToListAt(thi => source.ToArrayAt(predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable @@ -41,7 +41,7 @@ static List ToList source.ToArray(selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable @@ -49,7 +49,7 @@ static List ToListAt => source.ToArrayAt(selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyCollection.cs similarity index 96% rename from NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyCollection.cs index 73e8947a8..ae60dc6d8 100644 --- a/NetFabric.Hyperlinq/Conversion/ToList/ToList.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyCollection.cs @@ -17,7 +17,7 @@ public static List ToList(this TEnum _ => ToArray(source).AsList(), }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -25,7 +25,7 @@ static List ToList(this where TPredicate : struct, IFunction => ToArray(source, predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToListAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -33,7 +33,7 @@ static List ToListAt(thi where TPredicate : struct, IFunction => ToArrayAt(source, predicate).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static List ToList(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -41,7 +41,7 @@ internal static List ToList => ToArray(source, selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static List ToListAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -49,7 +49,7 @@ internal static List ToListAt => ToArrayAt(source, selector).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static List ToList(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyList.cs new file mode 100644 index 000000000..e69e0402f --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToList.ValueReadOnlyList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static List ToList(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.ToList(source); + } +} diff --git a/NetFabric.Hyperlinq/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs similarity index 96% rename from NetFabric.Hyperlinq/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs index 465d62854..3d4a0f681 100644 --- a/NetFabric.Hyperlinq/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Conversion/ToList/ToListAsync.AsyncValueEnumerable.cs @@ -16,7 +16,7 @@ public static async ValueTask> ToListAsync (await source.ToArrayAsync(cancellationToken).ConfigureAwait(false)).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToListAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -25,7 +25,7 @@ static async ValueTask> ToListAsync (await source.ToArrayAsync(cancellationToken, predicate).ConfigureAwait(false)).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToListAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable @@ -34,7 +34,7 @@ static async ValueTask> ToListAtAsync (await source.ToArrayAtAsync(cancellationToken, predicate).ConfigureAwait(false)).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToListAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -43,7 +43,7 @@ static async ValueTask> ToListAsync (await source.ToArrayAsync(cancellationToken, selector).ConfigureAwait(false)).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToListAtAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -52,7 +52,7 @@ static async ValueTask> ToListAtAsync (await source.ToArrayAtAsync(cancellationToken, selector).ConfigureAwait(false)).AsList(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> ToListAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable diff --git a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlyList.cs similarity index 95% rename from NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlyList.cs index 9a77a2622..371ffb7d7 100644 --- a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlyList.cs @@ -8,7 +8,7 @@ namespace NetFabric.Hyperlinq public static partial class ReadOnlyListExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option ElementAt(this TList source, int index) where TList : struct, IReadOnlyList @@ -17,7 +17,7 @@ static Option ElementAt(this TList source, int index) : Option.Some(source[index]); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option ElementAt(this TList source, int index, TSelector selector) where TList : struct, IReadOnlyList @@ -27,7 +27,7 @@ internal static Option ElementAt(th : Option.Some(selector.Invoke(source[index])); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option ElementAtAt(this TList source, int index, TSelector selector) where TList : struct, IReadOnlyList diff --git a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlySpan.cs similarity index 95% rename from NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlySpan.cs index 60e1dad20..a452d86e8 100644 --- a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ReadOnlySpan.cs @@ -13,7 +13,7 @@ static Option ElementAt(this ReadOnlySpan source, int : Option.Some(source[index]); - [GeneratorIgnore] + static Option ElementAt(this ReadOnlySpan source, int index, TPredicate predicate) where TPredicate : struct, IFunction { @@ -29,7 +29,7 @@ static Option ElementAt(this ReadOnlySpan } - [GeneratorIgnore] + static Option ElementAtAt(this ReadOnlySpan source, int index, TPredicate predicate) where TPredicate : struct, IFunction { @@ -46,7 +46,7 @@ static Option ElementAtAt(this ReadOnlySpan ElementAt(this ReadOnlySpan source, int index, TSelector selector) where TSelector : struct, IFunction => index < 0 || index >= source.Length @@ -54,7 +54,7 @@ static Option ElementAt(this ReadOnlySpan< : Option.Some(selector.Invoke(source[index])); - [GeneratorIgnore] + static Option ElementAtAt(this ReadOnlySpan source, int index, TSelector selector) where TSelector : struct, IFunction => index < 0 || index >= source.Length @@ -62,7 +62,7 @@ static Option ElementAtAt(this ReadOnlySpa : Option.Some(selector.Invoke(source[index], index)); - [GeneratorIgnore] + static Option ElementAt(this ReadOnlySpan source, int index, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueEnumerable.cs index 914a38426..c79dfe2c5 100644 --- a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueEnumerable.cs @@ -23,7 +23,7 @@ public static Option ElementAt(this } - [GeneratorIgnore] + internal static Option ElementAt(this TEnumerable source, int index, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -42,7 +42,7 @@ internal static Option ElementAt ElementAtAt(this TEnumerable source, int index, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -64,7 +64,7 @@ internal static Option ElementAtAt ElementAt(this TEnumerable source, int index, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -84,7 +84,7 @@ internal static Option ElementAt ElementAtAt(this TEnumerable source, int index, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -106,7 +106,7 @@ internal static Option ElementAtAt ElementAt(this TEnumerable source, int index, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs similarity index 97% rename from NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs index 68cac0e57..80eb7020b 100644 --- a/NetFabric.Hyperlinq/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyCollection.cs @@ -18,7 +18,7 @@ public static Option ElementAt(this : Option.None }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option ElementAt(this TEnumerable source, int index, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -30,7 +30,7 @@ static Option ElementAt( _ => ValueEnumerableExtensions.ElementAt(source, index, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option ElementAtAt(this TEnumerable source, int index, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -42,7 +42,7 @@ static Option ElementAtAt ValueEnumerableExtensions.ElementAtAt(source, index, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option ElementAt(this TEnumerable source, int index, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -57,7 +57,7 @@ static Option ElementAt ElementAtAt(this TEnumerable source, int index, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -71,7 +71,7 @@ static Option ElementAtAt ElementAt(this TEnumerable source, int index, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyList.cs new file mode 100644 index 000000000..736663171 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAt.ValueReadOnlyList.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option ElementAt(this TEnumerable source, int index) + where TEnumerable : IValueReadOnlyCollection + where TEnumerator : struct, IEnumerator + => source switch + { + {Count: 0} => Option.None, + _ => index < source.Count + ? ValueEnumerableExtensions.ElementAt(source, index) + : Option.None + }; + } +} diff --git a/NetFabric.Hyperlinq/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs index c9c3f5aca..c073a15ea 100644 --- a/NetFabric.Hyperlinq/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/ElementAt/ElementAtAsync.AsyncValueEnumerable.cs @@ -35,7 +35,7 @@ static async ValueTask> ExecuteAsync(TEnumerable source, int ind } - [GeneratorIgnore] + static ValueTask> ElementAtAsync(this TEnumerable source, int index, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -65,7 +65,7 @@ static async ValueTask> ExecuteAsync(TEnumerable source, int ind } - [GeneratorIgnore] + static ValueTask> ElementAtAtAsync(this TEnumerable source, int index, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -98,7 +98,7 @@ static async ValueTask> ExecuteAsync(TEnumerable source, int ind } - [GeneratorIgnore] + static ValueTask> ElementAtAsync(this TEnumerable source, int index, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -128,7 +128,7 @@ static async ValueTask> ExecuteAsync(TEnumerable source, int ind } - [GeneratorIgnore] + static ValueTask> ElementAtAtAsync(this TEnumerable source, int index, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -161,7 +161,7 @@ static async ValueTask> ExecuteAsync(TEnumerable source, int ind } - [GeneratorIgnore] + static ValueTask> ElementAtAsync(this TEnumerable source, int index, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq/Element/First/First.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlyList.cs similarity index 94% rename from NetFabric.Hyperlinq/Element/First/First.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlyList.cs index 7b9af035e..d2aa13217 100644 --- a/NetFabric.Hyperlinq/Element/First/First.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlyList.cs @@ -7,7 +7,7 @@ namespace NetFabric.Hyperlinq public static partial class ReadOnlyListExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option First(this TList source) where TList : struct, IReadOnlyList @@ -17,7 +17,7 @@ static Option First(this TList source) _ => Option.Some(source[0]) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option First(this TList source, TSelector selector) where TList : struct, IReadOnlyList @@ -29,7 +29,7 @@ internal static Option First(this T }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option FirstAt(this TList source, TSelector selector) where TList : struct, IReadOnlyList diff --git a/NetFabric.Hyperlinq/Element/First/First.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlySpan.cs similarity index 95% rename from NetFabric.Hyperlinq/Element/First/First.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlySpan.cs index 2e34346c1..830e8f082 100644 --- a/NetFabric.Hyperlinq/Element/First/First.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Element/First/First.ReadOnlySpan.cs @@ -14,7 +14,7 @@ static Option First(this ReadOnlySpan source) _ => Option.Some(source[0]) }; - [GeneratorIgnore] + static Option First(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -28,7 +28,7 @@ static Option First(this ReadOnlySpan sou } - [GeneratorIgnore] + static Option FirstAt(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -42,7 +42,7 @@ static Option FirstAt(this ReadOnlySpan s } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option First(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction @@ -53,7 +53,7 @@ static Option First(this ReadOnlySpan FirstAt(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction @@ -64,7 +64,7 @@ static Option FirstAt(this ReadOnlySpan First(this ReadOnlySpan source, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Element/First/First.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/First/First.ValueEnumerable.cs similarity index 96% rename from NetFabric.Hyperlinq/Element/First/First.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/First/First.ValueEnumerable.cs index 50251b11b..95379dea5 100644 --- a/NetFabric.Hyperlinq/Element/First/First.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/First/First.ValueEnumerable.cs @@ -18,7 +18,7 @@ public static Option First(this TEnu } - [GeneratorIgnore] + internal static Option First(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -36,7 +36,7 @@ internal static Option First FirstAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -56,7 +56,7 @@ internal static Option FirstAt First(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -71,7 +71,7 @@ internal static Option First FirstAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -86,7 +86,7 @@ internal static Option FirstAt First(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Element/First/First.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyCollection.cs similarity index 94% rename from NetFabric.Hyperlinq/Element/First/First.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyCollection.cs index 2f01ff17e..dcdd30bba 100644 --- a/NetFabric.Hyperlinq/Element/First/First.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyCollection.cs @@ -20,12 +20,12 @@ public static Option First(this TEnu static Option GetFirst(TEnumerable source) { using var enumerator = source.GetEnumerator(); - enumerator.MoveNext(); + _ = enumerator.MoveNext(); return Option.Some(enumerator.Current); } } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option First(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -37,7 +37,7 @@ static Option First(this _ => ValueEnumerableExtensions.First(source, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option FirstAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -49,7 +49,7 @@ static Option FirstAt(th _ => ValueEnumerableExtensions.FirstAt(source, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option First(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -65,13 +65,13 @@ static Option First GetFirst(TEnumerable source, TSelector selector) { using var enumerator = source.GetEnumerator(); - enumerator.MoveNext(); + _ = enumerator.MoveNext(); return Option.Some(selector.Invoke(enumerator.Current)); } } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option FirstAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -87,13 +87,13 @@ static Option FirstAt GetFirst(TEnumerable source, TSelector selector) { using var enumerator = source.GetEnumerator(); - enumerator.MoveNext(); + _ = enumerator.MoveNext(); return Option.Some(selector.Invoke(enumerator.Current, 0)); } } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option First(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyList.cs new file mode 100644 index 000000000..19488681e --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Element/First/First.ValueReadOnlyList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option First(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.First(source); + } +} diff --git a/NetFabric.Hyperlinq/Element/First/FirstAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/First/FirstAsync.AsyncValueEnumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Element/First/FirstAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/First/FirstAsync.AsyncValueEnumerable.cs index 4ac0040c0..2216e721e 100644 --- a/NetFabric.Hyperlinq/Element/First/FirstAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/First/FirstAsync.AsyncValueEnumerable.cs @@ -28,7 +28,7 @@ public static async ValueTask> FirstAsync> FirstAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -52,7 +52,7 @@ static async ValueTask> FirstAsync> FirstAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -79,7 +79,7 @@ static async ValueTask> FirstAtAsync> FirstAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -102,7 +102,7 @@ static async ValueTask> FirstAsync> FirstAtAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable @@ -125,7 +125,7 @@ static async ValueTask> FirstAtAsync> FirstAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq/Element/Single/Single.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlyList.cs similarity index 94% rename from NetFabric.Hyperlinq/Element/Single/Single.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlyList.cs index b121eaf53..45d81b242 100644 --- a/NetFabric.Hyperlinq/Element/Single/Single.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlyList.cs @@ -6,7 +6,7 @@ namespace NetFabric.Hyperlinq public static partial class ReadOnlyListExtensions { - [GeneratorIgnore] + static Option Single(this TList source) where TList : struct, IReadOnlyList => source switch @@ -15,7 +15,7 @@ static Option Single(this TList source) _ => Option.None, }; - [GeneratorIgnore] + internal static Option Single(this TList source, TSelector selector) where TList : struct, IReadOnlyList where TSelector : struct, IFunction @@ -26,7 +26,7 @@ internal static Option Single(this }; - [GeneratorIgnore] + internal static Option SingleAt(this TList source, TSelector selector) where TList : struct, IReadOnlyList where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Element/Single/Single.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlySpan.cs similarity index 96% rename from NetFabric.Hyperlinq/Element/Single/Single.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlySpan.cs index 56f05ceee..4042a258f 100644 --- a/NetFabric.Hyperlinq/Element/Single/Single.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Element/Single/Single.ReadOnlySpan.cs @@ -12,7 +12,6 @@ static Option Single(this ReadOnlySpan source) _ => Option.None, }; - [GeneratorIgnore] static Option Single(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -35,7 +34,6 @@ static Option Single(this ReadOnlySpan so } - [GeneratorIgnore] static Option SingleAt(this ReadOnlySpan source, TPredicate predicate) where TPredicate : struct, IFunction { @@ -58,7 +56,6 @@ static Option SingleAt(this ReadOnlySpan } - [GeneratorIgnore] static Option Single(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction => source switch @@ -68,7 +65,6 @@ static Option Single(this ReadOnlySpan SingleAt(this ReadOnlySpan source, TSelector selector) where TSelector : struct, IFunction => source switch @@ -78,7 +74,7 @@ static Option SingleAt(this ReadOnlySpan Single(this ReadOnlySpan source, TPredicate predicate, TSelector selector) where TPredicate : struct, IFunction where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Element/Single/Single.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueEnumerable.cs similarity index 96% rename from NetFabric.Hyperlinq/Element/Single/Single.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/Single/Single.ValueEnumerable.cs index 9ab5eeb54..ae7ac435c 100644 --- a/NetFabric.Hyperlinq/Element/Single/Single.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueEnumerable.cs @@ -13,7 +13,7 @@ public static Option Single(this TEn => source.GetSingle(); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option Single(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable @@ -22,7 +22,7 @@ internal static Option Single source.GetSingle(predicate); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static Option SingleAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable @@ -31,7 +31,7 @@ internal static Option SingleAt source.GetSingleAt(predicate); - [GeneratorIgnore] + static Option Single(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -41,7 +41,7 @@ static Option Single(selector); - [GeneratorIgnore] + static Option SingleAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -63,7 +63,7 @@ public TResult Invoke(TSource item) => selector.Invoke(item, 0); } - [GeneratorIgnore] + internal static Option Single(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -75,7 +75,7 @@ internal static Option Single GetSingle(this TEnumerable source) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -93,7 +93,7 @@ static Option GetSingle(this TEnumer } - [GeneratorIgnore] + static Option GetSingle(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -120,7 +120,7 @@ static Option GetSingle( } - [GeneratorIgnore] + static Option GetSingleAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Element/Single/Single.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyCollection.cs similarity index 97% rename from NetFabric.Hyperlinq/Element/Single/Single.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyCollection.cs index e0a00e1ce..899a89bd4 100644 --- a/NetFabric.Hyperlinq/Element/Single/Single.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyCollection.cs @@ -25,7 +25,7 @@ static Option GetSingle(TEnumerable source) } } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option Single(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -37,7 +37,7 @@ static Option Single(thi _ => ValueEnumerableExtensions.Single(source, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option SingleAt(this TEnumerable source, TPredicate predicate) where TEnumerable : IValueReadOnlyCollection @@ -49,7 +49,7 @@ static Option SingleAt(t _ => ValueEnumerableExtensions.SingleAt(source, predicate) }; - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option Single(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -70,7 +70,7 @@ static Option GetSingle(TEnumerable source, TSelector selector) } } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option SingleAt(this TEnumerable source, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -92,7 +92,7 @@ static Option GetSingle(TEnumerable source, TSelector selector) } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static Option Single(this TEnumerable source, TPredicate predicate, TSelector selector) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyList.cs new file mode 100644 index 000000000..49e6dd264 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Element/Single/Single.ValueReadOnlyList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Option Single(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Single(source); + } +} diff --git a/NetFabric.Hyperlinq/Element/Single/SingleAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Element/Single/SingleAsync.AsyncValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Element/Single/SingleAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Element/Single/SingleAsync.AsyncValueEnumerable.cs index 436690e85..1b46d236d 100644 --- a/NetFabric.Hyperlinq/Element/Single/SingleAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Element/Single/SingleAsync.AsyncValueEnumerable.cs @@ -15,7 +15,7 @@ public static ValueTask> SingleAsync source.GetSingleAsync(cancellationToken); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ValueTask> SingleAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate = default) where TEnumerable : IAsyncValueEnumerable @@ -24,7 +24,7 @@ static ValueTask> SingleAsync source.GetSingleAsync(cancellationToken, predicate); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ValueTask> SingleAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate = default) where TEnumerable : IAsyncValueEnumerable @@ -33,7 +33,7 @@ static ValueTask> SingleAtAsync source.GetSingleAtAsync(cancellationToken, predicate); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> SingleAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector = default) where TEnumerable : IAsyncValueEnumerable @@ -45,7 +45,7 @@ static async ValueTask> SingleAsync> SingleAtAsync(this TEnumerable source, CancellationToken cancellationToken, TSelector selector = default) where TEnumerable : IAsyncValueEnumerable @@ -69,7 +69,7 @@ public ValueTask InvokeAsync(TSource item, CancellationToken cancellati => selector.InvokeAsync(item, 0, cancellationToken); } - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static async ValueTask> SingleAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate, TSelector selector = default) where TEnumerable : IAsyncValueEnumerable @@ -85,7 +85,7 @@ static async ValueTask> SingleAsync> GetSingleAsync(this TEnumerable source, CancellationToken cancellationToken) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -109,7 +109,6 @@ static async ValueTask> GetSingleAsync> GetSingleAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -144,7 +143,7 @@ static async ValueTask> GetSingleAsync> GetSingleAtAsync(this TEnumerable source, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs similarity index 98% rename from NetFabric.Hyperlinq/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs index a8ff05a86..6b6a86359 100644 --- a/NetFabric.Hyperlinq/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Equality/SequenceEqual/SequenceEqual.ReadOnlySpan.cs @@ -5,7 +5,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorIgnore] + static bool SequenceEqual(this ReadOnlySpan first, TEnumerable second, IEqualityComparer? comparer = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ArraySegment.cs similarity index 81% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ArraySegment.cs index e1443b60a..15df2b3f2 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ArraySegment.cs @@ -10,7 +10,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentWhereEnumerable> Where(this in ArraySegment source, Func predicate) => source.Where(new FunctionWrapper(predicate)); @@ -101,7 +101,7 @@ public readonly void Dispose() { } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count() - => ((ReadOnlySpan)source.AsSpan()).Count(predicate); + => source.AsReadOnlySpan().Count(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(Func predicate) @@ -110,7 +110,7 @@ public int Count(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).Count(new PredicatePredicateCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().Count(new PredicatePredicateCombination(this.predicate, predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(Func predicate) @@ -119,14 +119,14 @@ public int Count(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).CountAt(new PredicatePredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().CountAt(new PredicatePredicateAtCombination(this.predicate, predicate)); #endregion #region Quantifier [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All() - => ((ReadOnlySpan)source.AsSpan()).All(predicate); + => source.AsReadOnlySpan().All(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(Func predicate) @@ -135,7 +135,7 @@ public bool All(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).All(new PredicatePredicateCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().All(new PredicatePredicateCombination(this.predicate, predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(Func predicate) @@ -144,11 +144,11 @@ public bool All(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AllAt(new PredicatePredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().AllAt(new PredicatePredicateAtCombination(this.predicate, predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any() - => ((ReadOnlySpan)source.AsSpan()).Any(predicate); + => source.AsReadOnlySpan().Any(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(Func predicate) @@ -157,7 +157,7 @@ public bool Any(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).Any(new PredicatePredicateCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().Any(new PredicatePredicateCombination(this.predicate, predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(Func predicate) @@ -166,7 +166,7 @@ public bool Any(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AnyAt(new PredicatePredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().AnyAt(new PredicatePredicateAtCombination(this.predicate, predicate)); #endregion #region Filtering @@ -206,16 +206,16 @@ public ArraySegmentWhereSelectEnumerable ElementAt(int index) - => ((ReadOnlySpan)source.AsSpan()).ElementAt(index, predicate); + => source.AsReadOnlySpan().ElementAt(index, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option First() - => ((ReadOnlySpan)source.AsSpan()).First(predicate); + => source.AsReadOnlySpan().First(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option Single() #pragma warning disable HLQ005 // Avoid Single() and SingleOrDefault() - => ((ReadOnlySpan)source.AsSpan()).Single(predicate); + => source.AsReadOnlySpan().Single(predicate); #pragma warning restore HLQ005 // Avoid Single() and SingleOrDefault() #endregion @@ -223,7 +223,7 @@ public Option Single() [MethodImpl(MethodImplOptions.AggressiveInlining)] public TSource[] ToArray() - => ((ReadOnlySpan)source.AsSpan()).ToArray(predicate); + => source.AsReadOnlySpan().ToArray(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) @@ -231,7 +231,7 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def [MethodImpl(MethodImplOptions.AggressiveInlining)] public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToList(predicate); + => source.AsReadOnlySpan().ToList(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) @@ -242,7 +242,7 @@ public Dictionary ToDictionary(Func keySelec public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, comparer, predicate); + => source.AsReadOnlySpan().ToDictionary(keySelector, comparer, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) @@ -254,7 +254,7 @@ public Dictionary ToDictionary where TElementSelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, elementSelector, comparer, predicate); + => source.AsReadOnlySpan().ToDictionary(keySelector, elementSelector, comparer, predicate); #endregion } @@ -262,72 +262,72 @@ public Dictionary ToDictionary(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate); + => source.source.AsReadOnlySpan().Sum(source.predicate); } } diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.AsyncValueEnumerable.cs similarity index 84% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.AsyncValueEnumerable.cs index 622f4eeca..62c36eeaf 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.AsyncValueEnumerable.cs @@ -12,13 +12,6 @@ namespace NetFabric.Hyperlinq public static partial class AsyncValueEnumerableExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.AsyncFunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereEnumerable> Where(this TEnumerable source, Func> predicate) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.Where>(new AsyncFunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereEnumerable Where(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IAsyncValueEnumerable @@ -206,19 +199,11 @@ readonly void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine public ValueTask CountAsync(CancellationToken cancellationToken = default) => source.CountAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.CountAsync>(new AsyncPredicatePredicateCombination(this.predicate, predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAtAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -231,19 +216,11 @@ public ValueTask CountAtAsync(TPredicate2 predicate = default, public ValueTask AllAsync(CancellationToken cancellationToken = default) => source.AllAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.AllAsync>(new AsyncPredicatePredicateCombination(this.predicate, predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAtAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -253,19 +230,11 @@ public ValueTask AllAtAsync(TPredicate2 predicate = default, public ValueTask AnyAsync(CancellationToken cancellationToken = default) => source.AnyAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.AnyAsync>(new AsyncPredicatePredicateCombination(this.predicate, predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAtAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -274,10 +243,6 @@ public ValueTask AnyAtAsync(TPredicate2 predicate = default, #endregion #region Projection - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereSelectEnumerable> Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable Select(TSelector selector = default) where TSelector : struct, IAsyncFunction @@ -286,18 +251,10 @@ public WhereSelectEnumerable, TSource>> Where(Func> predicate) - => Where(new AsyncFunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IAsyncFunction => source.Where>(new AsyncPredicatePredicateCombination(this.predicate, predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func> predicate) - => WhereAt(new AsyncFunctionWrapper(predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) @@ -335,11 +292,6 @@ public ValueTask> ToArrayAsync(ArrayPool pool, Cancellat [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToListAsync(CancellationToken cancellationToken = default) => source.ToListAsync(cancellationToken, predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync(new AsyncFunctionWrapper(keySelector), comparer, cancellationToken); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) @@ -347,11 +299,6 @@ public ValueTask> ToDictionaryAsync => source.ToDictionaryAsync(keySelector, comparer, cancellationToken, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, Func> elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync, AsyncFunctionWrapper>(new AsyncFunctionWrapper(keySelector), new AsyncFunctionWrapper(elementSelector), comparer, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlyMemory.cs similarity index 99% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlyMemory.cs index b6242cfcf..bc3a4da78 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlyMemory.cs @@ -10,7 +10,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemoryWhereEnumerable> Where(this ReadOnlyMemory source, Func predicate) => source.Where(new FunctionWrapper(predicate)); diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlySpan.cs similarity index 99% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlySpan.cs index b587ab670..2f3334d28 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ReadOnlySpan.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanWhereEnumerable> Where(this ReadOnlySpan source, Func predicate) => source.Where(new FunctionWrapper(predicate)); diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueEnumerable.cs similarity index 83% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueEnumerable.cs index 42f503c9e..a7ce272bd 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueEnumerable.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereEnumerable> Where(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.Where>(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereEnumerable Where(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable @@ -103,19 +96,11 @@ public void Dispose() public int Count() => source.Count(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.Count>(new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -142,22 +127,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => source.ToList(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => source.ToDictionary(keySelector, comparer, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull @@ -172,19 +147,11 @@ public Dictionary ToDictionary source.All(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.All>(new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -194,19 +161,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => source.Any(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.Any>(new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -215,19 +174,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereEnumerable, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.Where>(new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func predicate) - => WhereAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -236,10 +187,6 @@ public WhereAtEnumerable> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable Select(TSelector selector = default) where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs similarity index 83% rename from NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs index a0ec54406..6e4022ee0 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyCollection.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereEnumerable> Where(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => Where>(source, new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereEnumerable Where(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection @@ -102,19 +95,11 @@ public void Dispose() public int Count() => ValueReadOnlyCollectionExtensions.Count(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.Count>(source, new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -127,19 +112,11 @@ public int CountAt(TPredicate2 predicate = default) public bool All() => ValueReadOnlyCollectionExtensions.All(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.All>(source, new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -149,19 +126,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => ValueReadOnlyCollectionExtensions.Any(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.Any>(source, new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -170,19 +139,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereEnumerable, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.Where>(source, new PredicatePredicateCombination(this.predicate, predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func predicate) - => WhereAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -191,10 +152,6 @@ public WhereAtEnumerable> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable Select(TSelector selector = default) where TSelector : struct, IFunction @@ -232,22 +189,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => ValueReadOnlyCollectionExtensions.ToList(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => ValueReadOnlyCollectionExtensions.ToDictionary(source, keySelector, comparer, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyList.cs new file mode 100644 index 000000000..15759c6ba --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/Where.ValueReadOnlyList.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueReadOnlyCollectionExtensions.WhereEnumerable Where(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.Where(source, predicate); + } +} + diff --git a/NetFabric.Hyperlinq/Filtering/Where/Where/WhereEnumerator.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/Where/WhereEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Filtering/Where/Where/WhereEnumerator.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/Where/WhereEnumerator.cs diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs similarity index 80% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs index 63db8ad6c..545773f06 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ArraySegment.cs @@ -10,7 +10,6 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentWhereAtEnumerable> Where(this in ArraySegment source, Func predicate) => source.WhereAt(new FunctionWrapper(predicate)); @@ -107,7 +106,7 @@ public readonly void Dispose() { } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count() - => ((ReadOnlySpan)source.AsSpan()).CountAt(predicate); + => source.AsReadOnlySpan().CountAt(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(Func predicate) @@ -116,7 +115,7 @@ public int Count(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).CountAt(new PredicatePredicateAtCombination(predicate, this.predicate)); + => source.AsReadOnlySpan().CountAt(new PredicatePredicateAtCombination(predicate, this.predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(Func predicate) @@ -125,7 +124,7 @@ public int Count(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).CountAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().CountAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); #endregion #region Quantifier @@ -133,7 +132,7 @@ public int CountAt(TPredicate2 predicate = default) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All() - => ((ReadOnlySpan)source.AsSpan()).AllAt(predicate); + => source.AsReadOnlySpan().AllAt(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(Func predicate) @@ -142,7 +141,7 @@ public bool All(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AllAt(new PredicatePredicateAtCombination(predicate, this.predicate)); + => source.AsReadOnlySpan().AllAt(new PredicatePredicateAtCombination(predicate, this.predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(Func predicate) @@ -151,11 +150,11 @@ public bool All(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AllAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().AllAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any() - => ((ReadOnlySpan)source.AsSpan()).AnyAt(predicate); + => source.AsReadOnlySpan().AnyAt(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(Func predicate) @@ -164,7 +163,7 @@ public bool Any(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AnyAt(new PredicatePredicateAtCombination(predicate, this.predicate)); + => source.AsReadOnlySpan().AnyAt(new PredicatePredicateAtCombination(predicate, this.predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(Func predicate) @@ -173,7 +172,7 @@ public bool Any(Func predicate) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AnyAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); + => source.AsReadOnlySpan().AnyAt(new PredicateAtPredicateAtCombination(this.predicate, predicate)); #endregion #region Filtering @@ -204,16 +203,16 @@ public ArraySegmentWhereAtEnumerable ElementAt(int index) - => ((ReadOnlySpan)source.AsSpan()).ElementAtAt(index, predicate); + => source.AsReadOnlySpan().ElementAtAt(index, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option First() - => ((ReadOnlySpan)source.AsSpan()).FirstAt(predicate); + => source.AsReadOnlySpan().FirstAt(predicate); #pragma warning disable HLQ005 // Avoid Single() and SingleOrDefault() [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option Single() - => ((ReadOnlySpan)source.AsSpan()).SingleAt(predicate); + => source.AsReadOnlySpan().SingleAt(predicate); #pragma warning restore HLQ005 // Avoid Single() and SingleOrDefault() #endregion @@ -221,7 +220,7 @@ public Option Single() [MethodImpl(MethodImplOptions.AggressiveInlining)] public TSource[] ToArray() - => ((ReadOnlySpan)source.AsSpan()).ToArrayAt(predicate); + => source.AsReadOnlySpan().ToArrayAt(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) @@ -229,7 +228,7 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def [MethodImpl(MethodImplOptions.AggressiveInlining)] public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToListAt(predicate); + => source.AsReadOnlySpan().ToListAt(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) @@ -240,7 +239,7 @@ public Dictionary ToDictionary(Func keySelec public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionaryAt(keySelector, comparer, predicate); + => source.AsReadOnlySpan().ToDictionaryAt(keySelector, comparer, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) @@ -252,7 +251,7 @@ public Dictionary ToDictionary where TElementSelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionaryAt(keySelector, elementSelector, comparer, predicate); + => source.AsReadOnlySpan().ToDictionaryAt(keySelector, elementSelector, comparer, predicate); #endregion } @@ -260,72 +259,72 @@ public Dictionary ToDictionary(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereAtEnumerable source) where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).SumAt(source.predicate); + => source.source.AsReadOnlySpan().SumAt(source.predicate); } } diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs similarity index 85% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs index cfacfac20..2c01b55c3 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.AsyncValueEnumerable.cs @@ -12,13 +12,6 @@ namespace NetFabric.Hyperlinq public static partial class AsyncValueEnumerableExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.AsyncFunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereAtEnumerable> Where(this TEnumerable source, Func> predicate) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.WhereAt>(new AsyncFunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereAtEnumerable WhereAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IAsyncValueEnumerable @@ -208,19 +201,11 @@ readonly void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine public ValueTask CountAsync(CancellationToken cancellationToken = default) => source.CountAtAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.CountAtAsync>(new AsyncPredicatePredicateAtCombination(predicate, this.predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAtAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -233,19 +218,11 @@ public ValueTask CountAtAsync(TPredicate2 predicate, Cancellat public ValueTask AllAsync(CancellationToken cancellationToken = default) => source.AllAtAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.AllAtAsync>(new AsyncPredicatePredicateAtCombination(predicate, this.predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAtAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -255,19 +232,11 @@ public ValueTask AllAtAsync(TPredicate2 predicate, Cancellati public ValueTask AnyAsync(CancellationToken cancellationToken = default) => source.AnyAtAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => source.AnyAtAsync>(new AsyncPredicatePredicateAtCombination(predicate, this.predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAtAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -279,18 +248,10 @@ public ValueTask AnyAtAsync(TPredicate2 predicate, Cancellati #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TPredicate, TSource>> Where(Func> predicate) - => Where(new AsyncFunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IAsyncFunction => source.WhereAt>(new AsyncPredicatePredicateAtCombination(predicate, this.predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func> predicate) - => WhereAt(new AsyncFunctionWrapper(predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) @@ -328,11 +289,6 @@ public ValueTask> ToArrayAsync(ArrayPool pool, Cancellat [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToListAsync(CancellationToken cancellationToken = default) => source.ToListAtAsync(cancellationToken, predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync(new AsyncFunctionWrapper(keySelector), comparer, cancellationToken); [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) @@ -340,11 +296,6 @@ public ValueTask> ToDictionaryAsync => source.ToDictionaryAtAsync(keySelector, comparer, cancellationToken, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, Func> elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync, AsyncFunctionWrapper>(new AsyncFunctionWrapper(keySelector), new AsyncFunctionWrapper(elementSelector), comparer, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs similarity index 99% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs index b5f9d02d4..a08a106c6 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlyMemory.cs @@ -11,7 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemoryWhereAtEnumerable> Where(this ReadOnlyMemory source, Func predicate) => source.WhereAt(new FunctionWrapper(predicate)); diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs similarity index 99% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs index 69b2d3edd..c346fffda 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ReadOnlySpan.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanWhereAtEnumerable> Where(this ReadOnlySpan source, Func predicate) => source.WhereAt(new FunctionWrapper(predicate)); diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs similarity index 84% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs index 9bc9a5b54..ccf932394 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueEnumerable.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereAtEnumerable> Where(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.WhereAt>(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereAtEnumerable WhereAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable @@ -108,19 +101,11 @@ public void Dispose() public int Count() => source.CountAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.CountAt>(new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -133,19 +118,11 @@ public int CountAt(TPredicate2 predicate = default) public bool All() => source.AllAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.AllAt>(new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -155,19 +132,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => source.AnyAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.AnyAt>(new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -176,19 +145,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TPredicate, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => source.WhereAt>(new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func predicate) - => WhereAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -229,22 +190,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => source.ToListAt(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionaryAt(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionaryAt(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => source.ToDictionaryAt(keySelector, comparer, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionaryAt, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionaryAt(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs similarity index 84% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs index 52701135b..686e5fffe 100644 --- a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyCollection.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static WhereAtEnumerable> Where(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => WhereAt>(source, new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static WhereAtEnumerable WhereAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection @@ -107,19 +100,11 @@ public void Dispose() public int Count() => CountAt(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.CountAt>(source, new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -132,19 +117,11 @@ public int CountAt(TPredicate2 predicate = default) public bool All() => ValueReadOnlyCollectionExtensions.AllAt(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.AllAt>(source, new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -154,19 +131,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => ValueReadOnlyCollectionExtensions.AnyAt(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.AnyAt>(source, new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -175,19 +144,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TPredicate, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueReadOnlyCollectionExtensions.WhereAt>(source, new PredicatePredicateAtCombination(predicate, this.predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, TSource>> Where(Func predicate) - => WhereAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -228,22 +189,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => ToListAt(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => ToDictionaryAt(source, keySelector, comparer, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyList.cs new file mode 100644 index 000000000..8d1102f04 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAt.ValueReadOnlyList.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueReadOnlyCollectionExtensions.WhereAtEnumerable WhereAt(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.WhereAt(source, predicate); + } +} + diff --git a/NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAtEnumerator.cs b/NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAtEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Filtering/Where/WhereAt/WhereAtEnumerator.cs rename to NetFabric.Hyperlinq.Core/Filtering/Where/WhereAt/WhereAtEnumerator.cs diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs similarity index 76% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs index 0af6eba60..656f059a8 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ArraySegment.cs @@ -10,7 +10,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentWhereSelectEnumerable WhereSelect( this in ArraySegment source, @@ -20,7 +20,6 @@ static ArraySegmentWhereSelectEnumerable => new(source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct ArraySegmentWhereSelectEnumerable : IValueEnumerable.Enumerator> @@ -105,7 +104,7 @@ public readonly void Dispose() { } [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count() - => ((ReadOnlySpan)source.AsSpan()).Count(predicate); + => source.AsReadOnlySpan().Count(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(Func predicate) @@ -131,7 +130,7 @@ public int CountAt(TPredicate2 predicate = default) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All() - => ((ReadOnlySpan)source.AsSpan()).All(predicate); + => source.AsReadOnlySpan().All(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(Func predicate) @@ -153,7 +152,7 @@ public bool AllAt(TPredicate2 predicate = default) [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any() - => ((ReadOnlySpan)source.AsSpan()).Any(predicate); + => source.AsReadOnlySpan().Any(predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(Func predicate) @@ -176,19 +175,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TPredicate2> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.Where, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, TPredicate2> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -197,21 +188,11 @@ public ValueEnumerableExtensions.WhereAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ArraySegmentWhereSelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.WhereSelect>(predicate, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable @@ -224,22 +205,22 @@ public ValueEnumerableExtensions.SelectManyEnumerable ElementAt(int index) - => ((ReadOnlySpan)source.AsSpan()).ElementAt(index, predicate, selector); + => source.AsReadOnlySpan().ElementAt(index, predicate, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option First() - => ((ReadOnlySpan)source.AsSpan()).First(predicate, selector); + => source.AsReadOnlySpan().First(predicate, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option Single() - => ((ReadOnlySpan)source.AsSpan()).Single(predicate, selector); + => source.AsReadOnlySpan().Single(predicate, selector); #endregion #region Conversion [MethodImpl(MethodImplOptions.AggressiveInlining)] public TResult[] ToArray() - => ((ReadOnlySpan)source.AsSpan()).ToArray(predicate, selector); + => source.AsReadOnlySpan().ToArray(predicate, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) @@ -247,7 +228,7 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def [MethodImpl(MethodImplOptions.AggressiveInlining)] public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToList(predicate, selector); + => source.AsReadOnlySpan().ToList(predicate, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) @@ -258,7 +239,7 @@ public Dictionary ToDictionary(Func keySelec public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, comparer, predicate, selector); + => source.AsReadOnlySpan().ToDictionary(keySelector, comparer, predicate, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) @@ -270,7 +251,7 @@ public Dictionary ToDictionary where TElementSelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, elementSelector, comparer, predicate, selector); + => source.AsReadOnlySpan().ToDictionary(keySelector, elementSelector, comparer, predicate, selector); #endregion } @@ -279,85 +260,85 @@ public Dictionary ToDictionary(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentWhereSelectEnumerable source) where TPredicate : struct, IFunction where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.predicate, source.selector); + => source.source.AsReadOnlySpan().Sum(source.predicate, source.selector); } } diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs similarity index 86% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs index 02d24b5d6..dd5799b49 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.AsyncValueEnumerable.cs @@ -11,7 +11,7 @@ namespace NetFabric.Hyperlinq { public static partial class AsyncValueEnumerableExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static WhereSelectEnumerable WhereSelect( this TEnumerable source, @@ -23,7 +23,6 @@ static WhereSelectEnumerable => new(in source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct WhereSelectEnumerable : IAsyncValueEnumerable.Enumerator> @@ -234,19 +233,11 @@ void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) public ValueTask CountAsync(CancellationToken cancellationToken = default) => source.CountAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => AsyncValueEnumerableExtensions.CountAsync, Enumerator, TResult, TPredicate2>(this, predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask CountAsync(Func> predicate, CancellationToken cancellationToken = default) - => CountAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask CountAtAsync(TPredicate2 predicate = default, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -259,19 +250,11 @@ public ValueTask CountAtAsync(TPredicate2 predicate = default, public ValueTask AllAsync(CancellationToken cancellationToken = default) => source.AllAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => this.AllAsync, Enumerator, TResult, TPredicate2>(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AllAsync(Func> predicate, CancellationToken cancellationToken = default) - => AllAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AllAtAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -281,19 +264,11 @@ public ValueTask AllAtAsync(TPredicate2 predicate, Cancellati public ValueTask AnyAsync(CancellationToken cancellationToken = default) => source.AnyAsync(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction => this.AnyAsync, Enumerator, TResult, TPredicate2>(predicate, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask AnyAsync(Func> predicate, CancellationToken cancellationToken = default) - => AnyAtAsync(new AsyncFunctionWrapper(predicate), cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask AnyAtAsync(TPredicate2 predicate, CancellationToken cancellationToken = default) where TPredicate2 : struct, IAsyncFunction @@ -302,19 +277,11 @@ public ValueTask AnyAtAsync(TPredicate2 predicate, Cancellati #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereEnumerable, Enumerator, TResult, AsyncFunctionWrapper> Where(Func> predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable, Enumerator, TResult, TPredicate2> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IAsyncFunction => this.Where, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, Enumerator, TResult, AsyncFunctionWrapper> Where(Func> predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable, Enumerator, TResult, TPredicate2> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IAsyncFunction @@ -323,10 +290,6 @@ public WhereAtEnumerable, TSource, TResult, TResult2>> Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IAsyncFunction @@ -364,22 +327,12 @@ public ValueTask> ToArrayAsync(ArrayPool pool, Cancellat public ValueTask> ToListAsync(CancellationToken cancellationToken = default) => source.ToListAsync(cancellationToken, predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync(new AsyncFunctionWrapper(keySelector), comparer, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull where TKeySelector : struct, IAsyncFunction => source.ToDictionaryAsync(keySelector, comparer, cancellationToken, predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func> keySelector, Func> elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) - where TKey : notnull - => ToDictionaryAsync, AsyncFunctionWrapper>(new AsyncFunctionWrapper(keySelector), new AsyncFunctionWrapper(elementSelector), comparer, cancellationToken); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueTask> ToDictionaryAsync(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs similarity index 90% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs index 883bdc1c2..bfb1469e9 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlyMemory.cs @@ -11,7 +11,7 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemoryWhereSelectEnumerable WhereSelect( this ReadOnlyMemory source, @@ -21,7 +21,6 @@ static MemoryWhereSelectEnumerable Wher where TSelector : struct, IFunction => new(source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct MemoryWhereSelectEnumerable : IValueEnumerable.Enumerator> @@ -173,19 +172,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TPredicate2> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.Where, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, TPredicate2> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -194,21 +185,11 @@ public ValueEnumerableExtensions.WhereAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public MemoryWhereSelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.WhereSelect>(predicate, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs similarity index 99% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs index 07cfb1f15..5cbabe94b 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ReadOnlySpan.cs @@ -9,7 +9,7 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanWhereSelectEnumerable WhereSelect( this ReadOnlySpan source, @@ -19,7 +19,6 @@ static SpanWhereSelectEnumerable WhereS where TSelector : struct, IFunction => new(source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly ref struct SpanWhereSelectEnumerable where TPredicate : struct, IFunction diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs similarity index 83% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs index 8a816f47e..212b14883 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueEnumerable.cs @@ -11,7 +11,7 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static WhereSelectEnumerable WhereSelect( this TEnumerable source, @@ -23,7 +23,6 @@ static WhereSelectEnumerable => new(in source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct WhereSelectEnumerable : IValueEnumerable.Enumerator> @@ -108,19 +107,11 @@ public void Dispose() public int Count() => source.Count(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueEnumerableExtensions.Count, Enumerator, TResult, TPredicate2>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -133,19 +124,11 @@ public int CountAt(TPredicate2 predicate = default) public bool All() => source.All(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.All, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -155,19 +138,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => source.Any(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.Any, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -176,19 +151,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable, Enumerator, TResult, TPredicate2> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.Where, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => this.Where, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable, Enumerator, TResult, TPredicate2> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -197,21 +164,11 @@ public WhereAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.WhereSelect>(predicate, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable @@ -249,22 +206,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => source.ToList(predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => source.ToDictionary(keySelector, comparer, predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs similarity index 84% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs index f0f53d467..d163a0fce 100644 --- a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelect.ValueReadOnlyCollection.cs @@ -11,7 +11,7 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static WhereSelectEnumerable WhereSelect( this TEnumerable source, @@ -23,7 +23,6 @@ static WhereSelectEnumerable => new(in source, predicate, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct WhereSelectEnumerable : IValueEnumerable.Enumerator> @@ -108,19 +107,11 @@ public void Dispose() public int Count() => ValueReadOnlyCollectionExtensions.Count(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => Count(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int Count(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueEnumerableExtensions.Count, Enumerator, TResult, TPredicate2>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int Count(Func predicate) - => CountAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public int CountAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -133,19 +124,11 @@ public int CountAt(TPredicate2 predicate = default) public bool All() => ValueReadOnlyCollectionExtensions.All(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool All(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.All, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AllAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -155,19 +138,11 @@ public bool AllAt(TPredicate2 predicate = default) public bool Any() => ValueReadOnlyCollectionExtensions.Any(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => this.Any, Enumerator, TResult, TPredicate2>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -176,19 +151,11 @@ public bool AnyAt(TPredicate2 predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TPredicate2> Where(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction => ValueEnumerableExtensions.Where, Enumerator, TResult, TPredicate2>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, TPredicate2> WhereAt(TPredicate2 predicate = default) where TPredicate2 : struct, IFunction @@ -197,21 +164,11 @@ public ValueEnumerableExtensions.WhereAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereSelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => WhereSelect>(source, predicate, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => ValueEnumerableExtensions.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable @@ -249,22 +206,12 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def public List ToList() => ValueReadOnlyCollectionExtensions.ToList(source, predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull where TKeySelector : struct, IFunction => ValueReadOnlyCollectionExtensions.ToDictionary(source, keySelector, comparer, predicate, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelectEnumerator.cs b/NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelectEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Filtering/WhereSelect/WhereSelect/WhereSelectEnumerator.cs rename to NetFabric.Hyperlinq.Core/Filtering/WhereSelect/WhereSelect/WhereSelectEnumerator.cs diff --git a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Empty.cs b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Empty.cs similarity index 100% rename from NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Empty.cs rename to NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Empty.cs diff --git a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Range.cs b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Range.cs similarity index 99% rename from NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Range.cs rename to NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Range.cs index 474d2d5a8..63f676f55 100644 --- a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Range.cs +++ b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Range.cs @@ -29,7 +29,6 @@ public static RangeEnumerable Range(int start, int count) return new RangeEnumerable(start, count, end); } - [GeneratorMapping("TSource", "int", true)] [StructLayout(LayoutKind.Auto)] public readonly partial struct RangeEnumerable : IAsyncValueEnumerable diff --git a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Repeat.cs b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Repeat.cs similarity index 96% rename from NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Repeat.cs rename to NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Repeat.cs index e175a1a28..7989ab37d 100644 --- a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Repeat.cs +++ b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Repeat.cs @@ -155,10 +155,6 @@ public ValueTask ContainsAsync(TSource value, IEqualityComparer? ? new ValueTask(result: count is not 0 && EqualityComparer.Default.Equals(this.value, value)) : new ValueTask(result: count is not 0 && comparer.Equals(this.value, value)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public RepeatEnumerable Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public RepeatEnumerable Select(TSelector selector = default) where TSelector : struct, IAsyncFunction diff --git a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Return.cs b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Return.cs similarity index 72% rename from NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Return.cs rename to NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Return.cs index f9887481d..3e936f76c 100644 --- a/NetFabric.Hyperlinq/Generation/AsyncValueEnumerable/Return.cs +++ b/NetFabric.Hyperlinq.Core/Generation/AsyncValueEnumerable/Return.cs @@ -93,10 +93,6 @@ public ValueTask ContainsAsync(TSource value, IEqualityComparer? ? new ValueTask(result: EqualityComparer.Default.Equals(this.value, value)) : new ValueTask(result: comparer.Equals(this.value, value)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ReturnEnumerable Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReturnEnumerable Select(TSelector selector = default) where TSelector : struct, IAsyncFunction @@ -129,29 +125,19 @@ public ValueTask> ToListAsync() => new(result: new List(1) { value }); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionaryAsync(new FunctionWrapper(keySelector), comparer); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(TKeySelector keySelector, IEqualityComparer? comparer = default) + public async ValueTask> ToDictionaryAsync(TKeySelector keySelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull - where TKeySelector : struct, IFunction + where TKeySelector : struct, IAsyncFunction // ReSharper disable once HeapView.ObjectAllocation.Evident - => new(result: new Dictionary(1, comparer) { { keySelector.Invoke(value), value } }); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionaryAsync, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); + => new Dictionary(1, comparer) { { await keySelector.InvokeAsync(value, cancellationToken).ConfigureAwait(false), value } }; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueTask> ToDictionaryAsync(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) + public async ValueTask> ToDictionaryAsync(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default, CancellationToken cancellationToken = default) where TKey : notnull - where TKeySelector : struct, IFunction - where TElementSelector : struct, IFunction + where TKeySelector : struct, IAsyncFunction + where TElementSelector : struct, IAsyncFunction // ReSharper disable once HeapView.ObjectAllocation.Evident - => new(result: new Dictionary(1, comparer) { { keySelector.Invoke(value), elementSelector.Invoke(value) } }); + => new Dictionary(1, comparer) { { await keySelector.InvokeAsync(value, cancellationToken).ConfigureAwait(false), await elementSelector.InvokeAsync(value, cancellationToken).ConfigureAwait(false) } }; } #pragma warning disable IDE0060 // Remove unused parameter diff --git a/NetFabric.Hyperlinq/Generation/ValueEnumerable/CreateValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/CreateValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Generation/ValueEnumerable/CreateValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/CreateValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Empty.cs b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Empty.cs similarity index 100% rename from NetFabric.Hyperlinq/Generation/ValueEnumerable/Empty.cs rename to NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Empty.cs diff --git a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Range.cs b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Range.cs similarity index 92% rename from NetFabric.Hyperlinq/Generation/ValueEnumerable/Range.cs rename to NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Range.cs index dbe032359..2443a0670 100644 --- a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Range.cs +++ b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Range.cs @@ -29,7 +29,6 @@ public static RangeEnumerable Range(int start, int count) return new RangeEnumerable(start, count); } - [GeneratorMapping("TSource", "int", true)] [StructLayout(LayoutKind.Auto)] public readonly partial struct RangeEnumerable : IValueReadOnlyList @@ -123,23 +122,20 @@ void IList.RemoveAt(int index) public struct Enumerator { readonly int end; - int current; internal Enumerator(in RangeEnumerable enumerable) { - current = enumerable.start - 1; - end = current + enumerable.Count; + Current = enumerable.start - 1; + end = Current + enumerable.Count; } - public int Current - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => current; + public int Current { [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; private set; } [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool MoveNext() - => ++current <= end; + => ++Current <= end; } [StructLayout(LayoutKind.Auto)] @@ -147,26 +143,23 @@ public struct DisposableEnumerator : IEnumerator { readonly int end; - int current; internal DisposableEnumerator(in RangeEnumerable enumerable) { - current = enumerable.start - 1; - end = current + enumerable.Count; + Current = enumerable.start - 1; + end = Current + enumerable.Count; } - public int Current - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => current; + public int Current { [MethodImpl(MethodImplOptions.AggressiveInlining)] + get; private set; } object? IEnumerator.Current // ReSharper disable once HeapView.BoxingAllocation - => current; + => Current; [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool MoveNext() - => ++current <= end; + => ++Current <= end; [ExcludeFromCodeCoverage] [DoesNotReturn] diff --git a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Repeat.cs b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Repeat.cs similarity index 97% rename from NetFabric.Hyperlinq/Generation/ValueEnumerable/Repeat.cs rename to NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Repeat.cs index 2f3a0ac0b..e45ccc3f7 100644 --- a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Repeat.cs +++ b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Repeat.cs @@ -166,10 +166,6 @@ public bool Contains(TSource value, IEqualityComparer? comparer) _ => count is not 0 && comparer.Equals(this.value, value) }; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public RepeatEnumerable Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public RepeatEnumerable Select(TSelector selector = default) where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Return.cs b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Return.cs similarity index 88% rename from NetFabric.Hyperlinq/Generation/ValueEnumerable/Return.cs rename to NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Return.cs index 58f85cb90..2011435bd 100644 --- a/NetFabric.Hyperlinq/Generation/ValueEnumerable/Return.cs +++ b/NetFabric.Hyperlinq.Core/Generation/ValueEnumerable/Return.cs @@ -173,10 +173,6 @@ public bool Contains(TSource value, IEqualityComparer? comparer) _ => comparer.Equals(this.value, value) }; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ReturnEnumerable Select(Func selector) - => Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ReturnEnumerable Select(TSelector selector = default) where TSelector : struct, IFunction @@ -207,11 +203,6 @@ public TSource[] ToArray() public List ToList() => new(1) { value }; - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary(new FunctionWrapper(keySelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) where TKey : notnull @@ -219,11 +210,6 @@ public Dictionary ToDictionary(TKeySelector k // ReSharper disable once HeapView.ObjectAllocation.Evident => new(new Dictionary(1, comparer) { { keySelector.Invoke(value), value } }); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ToDictionary, FunctionWrapper>(new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) where TKey : notnull diff --git a/NetFabric.Hyperlinq/GlobalSuppressions.cs b/NetFabric.Hyperlinq.Core/GlobalSuppressions.cs similarity index 100% rename from NetFabric.Hyperlinq/GlobalSuppressions.cs rename to NetFabric.Hyperlinq.Core/GlobalSuppressions.cs diff --git a/NetFabric.Hyperlinq/Lease.cs b/NetFabric.Hyperlinq.Core/Lease.cs similarity index 100% rename from NetFabric.Hyperlinq/Lease.cs rename to NetFabric.Hyperlinq.Core/Lease.cs diff --git a/NetFabric.Hyperlinq.Core/NetFabric.Hyperlinq.Core.csproj b/NetFabric.Hyperlinq.Core/NetFabric.Hyperlinq.Core.csproj new file mode 100644 index 000000000..c36b41a0c --- /dev/null +++ b/NetFabric.Hyperlinq.Core/NetFabric.Hyperlinq.Core.csproj @@ -0,0 +1,84 @@ + + + + netstandard2.0;netcoreapp3.1;net5.0;net6.0 + NetFabric.Hyperlinq.Core + NetFabric.Hyperlinq.Core + The main assembly of NetFabric.Hyperlinq. + 1.0.0-beta00 + Icon.png + LICENSE + netfabric, hyperlinq, linq, enumeration, extensions, performance + true + true + true + snupkg + true + + NetFabric.Hyperlinq + + + + + $(NoWarn);8600;8601;8602;8603;8604 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + True + True + Resource.resx + + + + + + ResXFileCodeGenerator + Resource.Designer.cs + + + + diff --git a/NetFabric.Hyperlinq/Option/NoneOption.cs b/NetFabric.Hyperlinq.Core/Option/NoneOption.cs similarity index 100% rename from NetFabric.Hyperlinq/Option/NoneOption.cs rename to NetFabric.Hyperlinq.Core/Option/NoneOption.cs diff --git a/NetFabric.Hyperlinq/Option/Option.cs b/NetFabric.Hyperlinq.Core/Option/Option.cs similarity index 99% rename from NetFabric.Hyperlinq/Option/Option.cs rename to NetFabric.Hyperlinq.Core/Option/Option.cs index 6eb50cea1..88744c90d 100644 --- a/NetFabric.Hyperlinq/Option/Option.cs +++ b/NetFabric.Hyperlinq.Core/Option/Option.cs @@ -222,7 +222,6 @@ public List ToList() }; - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectManyEnumerable : IValueEnumerable.Enumerator> diff --git a/NetFabric.Hyperlinq/Partitioning/Skip/Skip.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Skip/Skip.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/Skip/Skip.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ReadOnlyList.cs similarity index 94% rename from NetFabric.Hyperlinq/Partitioning/Skip/Skip.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ReadOnlyList.cs index 4e30d7049..132bfd81a 100644 --- a/NetFabric.Hyperlinq/Partitioning/Skip/Skip.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ReadOnlyList.cs @@ -7,7 +7,7 @@ namespace NetFabric.Hyperlinq public static partial class ReadOnlyListExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static SkipTakeEnumerable Skip(this TList source, int count) where TList : struct, IReadOnlyList diff --git a/NetFabric.Hyperlinq/Partitioning/Skip/Skip.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Skip/Skip.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/Skip/Skip.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueReadOnlyCollection.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Skip/Skip.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueReadOnlyCollection.cs diff --git a/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueReadOnlyList.cs new file mode 100644 index 000000000..6c808b833 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Partitioning/Skip/Skip.ValueReadOnlyList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueReadOnlyCollectionExtensions.SkipTakeEnumerable Skip(this TEnumerable source, int count) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Skip(source, count); + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs similarity index 88% rename from NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs index d98d9f8f1..69727b49b 100644 --- a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ReadOnlyList.cs @@ -278,32 +278,5 @@ static bool ComparerContains(TList source, TSource value, IEqualityComparer(this in SkipTakeEnumerable source) - where TList : struct, IReadOnlyList - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, Func predicate) - where TList : struct, IReadOnlyList - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, TPredicate predicate = default) - where TList : struct, IReadOnlyList - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, Func predicate) - where TList : struct, IReadOnlyList - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this SkipTakeEnumerable source, TPredicate predicate = default) - where TList : struct, IReadOnlyList - where TPredicate : struct, IFunction - => source.CountAt(predicate); } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs similarity index 82% rename from NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs index ab93810ac..d3070fa55 100644 --- a/NetFabric.Hyperlinq/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Partitioning/SkipTake/SkipTake.ValueReadOnlyCollection.cs @@ -250,37 +250,5 @@ public SkipTakeEnumerable Take(int count) #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this in SkipTakeEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SkipTakeEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this SkipTakeEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.CountAt(predicate); } } \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Partitioning/Take/Take.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Take/Take.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Take/Take.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/Take/Take.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ReadOnlyList.cs similarity index 94% rename from NetFabric.Hyperlinq/Partitioning/Take/Take.ReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ReadOnlyList.cs index c9c2f0361..915fe8bcf 100644 --- a/NetFabric.Hyperlinq/Partitioning/Take/Take.ReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ReadOnlyList.cs @@ -6,7 +6,7 @@ namespace NetFabric.Hyperlinq public static partial class ReadOnlyListExtensions { - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static SkipTakeEnumerable Take(this TList source, int count) where TList : struct, IReadOnlyList diff --git a/NetFabric.Hyperlinq/Partitioning/Take/Take.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Take/Take.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Partitioning/Take/Take.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueReadOnlyCollection.cs similarity index 100% rename from NetFabric.Hyperlinq/Partitioning/Take/Take.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueReadOnlyCollection.cs diff --git a/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueReadOnlyList.cs new file mode 100644 index 000000000..02fa9d9ad --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Partitioning/Take/Take.ValueReadOnlyList.cs @@ -0,0 +1,15 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueReadOnlyCollectionExtensions.SkipTakeEnumerable Take(this TEnumerable source, int count) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Take(source, count); + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ArraySegment.cs similarity index 73% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ArraySegment.cs index f72ec8ee4..a8a19b00d 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ArraySegment.cs @@ -10,7 +10,6 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentSelectEnumerable> Select(this in ArraySegment source, Func selector) => source.Select>(new FunctionWrapper(selector)); @@ -20,7 +19,6 @@ static ArraySegmentSelectEnumerable Select => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct ArraySegmentSelectEnumerable : IValueReadOnlyList.Enumerator> @@ -92,7 +90,7 @@ void ICollection.Add(TResult item) void ICollection.Clear() => Throw.NotSupportedException(); public bool Contains(TResult item) - => ((ReadOnlySpan)source.AsSpan()).Contains(item, default, selector); + => source.AsReadOnlySpan().Contains(item, default, selector); bool ICollection.Remove(TResult item) => Throw.NotSupportedException(); @@ -183,41 +181,28 @@ public ArraySegmentSelectAtEnumerable => source.SelectAt>(new SelectorSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option ElementAt(int index) - => ((ReadOnlySpan)source.AsSpan()).ElementAt(index, selector); + => source.AsReadOnlySpan().ElementAt(index, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option First() - => ((ReadOnlySpan)source.AsSpan()).First(selector); + => source.AsReadOnlySpan().First(selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option Single() - => ((ReadOnlySpan)source.AsSpan()).Single(selector); + => source.AsReadOnlySpan().Single(selector); #endregion #region Conversion [MethodImpl(MethodImplOptions.AggressiveInlining)] public TResult[] ToArray() - => ((ReadOnlySpan)source.AsSpan()).ToArray(selector); + => source.AsReadOnlySpan().ToArray(selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) @@ -225,32 +210,17 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def [MethodImpl(MethodImplOptions.AggressiveInlining)] public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToList(selector); + => source.AsReadOnlySpan().ToList(selector); #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectEnumerable source) - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this ArraySegmentSelectEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction where TPredicate : struct, IFunction => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this ArraySegmentSelectEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction @@ -260,72 +230,72 @@ public static int CountAt(this ArraySeg [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nint Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static nuint Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static decimal Sum(this ArraySegmentSelectEnumerable source) where TSelector : struct, IFunction - => ((ReadOnlySpan)source.source.AsSpan()).Sum(source.selector); + => source.source.AsReadOnlySpan().Sum(source.selector); } } diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.AsyncValueEnumerable.cs similarity index 92% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.AsyncValueEnumerable.cs index 49d3d76a7..cf9417147 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.AsyncValueEnumerable.cs @@ -12,13 +12,6 @@ namespace NetFabric.Hyperlinq public static partial class AsyncValueEnumerableExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.AsyncFunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectEnumerable> Select(this TEnumerable source, Func> selector) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.Select>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectEnumerable Select(this TEnumerable source, TSelector selector = default) where TEnumerable : IAsyncValueEnumerable @@ -26,7 +19,6 @@ public static SelectEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectEnumerable : IAsyncValueEnumerable.Enumerator> @@ -216,20 +208,12 @@ public ValueTask AnyAsync(CancellationToken cancellationToken = default) #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectEnumerable, TSource, TResult, TResult2>> Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IAsyncFunction => source.Select>(new AsyncSelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func> selector) - => SelectAt>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IAsyncFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlyMemory.cs similarity index 84% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlyMemory.cs index b62a3715c..6b7094a0f 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlyMemory.cs @@ -11,7 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemorySelectEnumerable> Select(this ReadOnlyMemory source, Func selector) => source.Select>(new FunctionWrapper(selector)); @@ -21,7 +20,6 @@ static MemorySelectEnumerable Select => new(source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct MemorySelectEnumerable : IValueReadOnlyList.Enumerator> @@ -171,19 +169,6 @@ public MemorySelectAtEnumerable => source.SelectAt>(new SelectorSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -215,27 +200,12 @@ public List ToList() #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectEnumerable source) - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, MemorySelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this MemorySelectEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction where TPredicate : struct, IFunction => ValueReadOnlyCollectionExtensions.Count, MemorySelectEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, MemorySelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this MemorySelectEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlySpan.cs similarity index 96% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlySpan.cs index 7c3bae6fa..81181db8a 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ReadOnlySpan.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanSelectEnumerable> Select(this ReadOnlySpan source, Func selector) => source.Select>(new FunctionWrapper(selector)); @@ -19,7 +18,6 @@ static SpanSelectEnumerable Select => new(source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public ref struct SpanSelectEnumerable where TSelector : struct, IFunction @@ -132,11 +130,6 @@ public bool SequenceEqual(IEnumerable other, IEqualityComparer } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanSelectEnumerable source) - where TSelector : struct, IFunction - => source.Count; - // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public static int Count(this SpanSelectEnumerable source, Func predicate) // where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueEnumerable.cs similarity index 86% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueEnumerable.cs index 868a3013e..f45fc6316 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueEnumerable.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectEnumerable> Select(this TEnumerable source, Func selector) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.Select>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectEnumerable Select(this TEnumerable source, TSelector selector = default) where TEnumerable : IValueEnumerable @@ -25,7 +18,6 @@ public static SelectEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectEnumerable : IValueEnumerable.Enumerator> @@ -106,31 +98,17 @@ public bool Any() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.Select>(new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.SelectAt>(new SelectorSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyCollection.cs similarity index 77% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyCollection.cs index 03ae3ac84..b472b0695 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyCollection.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectEnumerable> Select(this TEnumerable source, Func selector) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => Select>(source, new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectEnumerable Select(this TEnumerable source, TSelector selector = default) where TEnumerable : IValueReadOnlyCollection @@ -25,7 +18,6 @@ public static SelectEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct SelectEnumerable : IValueReadOnlyCollection.Enumerator> @@ -140,38 +132,17 @@ public bool Any() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyCollectionExtensions.Select>(source, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyCollectionExtensions.SelectAt>(source, new SelectorSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -204,20 +175,6 @@ public List ToList() #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this in SelectEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => Count, SelectEnumerable.Enumerator, TResult>(source, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this SelectEnumerable source, TPredicate predicate = default) @@ -227,13 +184,6 @@ public static int Count => Count, SelectEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => Count, SelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this SelectEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyList.cs similarity index 81% rename from NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyList.cs index 67ee2408c..9966ada5c 100644 --- a/NetFabric.Hyperlinq/Projection/Select/Select/Select.ValueReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/Select/Select.ValueReadOnlyList.cs @@ -11,7 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyListExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectEnumerable> Select(this TEnumerable source, Func selector) where TEnumerable : struct, IValueReadOnlyList @@ -25,7 +24,6 @@ public static SelectEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct SelectEnumerable : IValueReadOnlyList.Enumerator> @@ -160,38 +158,17 @@ public void Dispose() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyListExtensions.Select>(source, new SelectorSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyListExtensions.SelectAt>(source, new SelectorSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -230,20 +207,6 @@ public readonly List ToList() #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this in SelectEnumerable source) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectEnumerable source, Func predicate) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, SelectEnumerable.Enumerator, TResult>(source, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this SelectEnumerable source, TPredicate predicate = default) @@ -253,13 +216,6 @@ public static int Count => ValueReadOnlyCollectionExtensions.Count, SelectEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectEnumerable source, Func predicate) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, SelectEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this SelectEnumerable source, TPredicate predicate = default) where TEnumerable : struct, IValueReadOnlyList diff --git a/NetFabric.Hyperlinq/Projection/Select/Select/SelectEnumerator.cs b/NetFabric.Hyperlinq.Core/Projection/Select/Select/SelectEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Projection/Select/Select/SelectEnumerator.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/Select/SelectEnumerator.cs diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ArraySegment.cs similarity index 81% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ArraySegment.cs index 8c531f0d7..8a86230a4 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ArraySegment.cs @@ -10,7 +10,7 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] + [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentSelectAtEnumerable> Select(this in ArraySegment source, Func selector) => source.SelectAt>(new FunctionWrapper(selector)); @@ -20,7 +20,6 @@ static ArraySegmentSelectAtEnumerable SelectAt => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct ArraySegmentSelectAtEnumerable : IValueReadOnlyList.Enumerator> @@ -85,7 +84,7 @@ void ICollection.Add(TResult item) void ICollection.Clear() => Throw.NotSupportedException(); public bool Contains(TResult item) - => ((ReadOnlySpan)source.AsSpan()).ContainsAt(item, default, selector); + => source.AsReadOnlySpan().ContainsAt(item, default, selector); bool ICollection.Remove(TResult item) => Throw.NotSupportedException(); int IList.IndexOf(TResult item) @@ -175,40 +174,27 @@ public ArraySegmentSelectAtEnumerable => source.SelectAt>(new SelectorAtSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option ElementAt(int index) - => ((ReadOnlySpan)source.AsSpan()).ElementAtAt(index, selector); + => source.AsReadOnlySpan().ElementAtAt(index, selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option First() - => ((ReadOnlySpan)source.AsSpan()).FirstAt(selector); + => source.AsReadOnlySpan().FirstAt(selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Option Single() - => ((ReadOnlySpan)source.AsSpan()).SingleAt(selector); + => source.AsReadOnlySpan().SingleAt(selector); #endregion #region Conversion [MethodImpl(MethodImplOptions.AggressiveInlining)] public TResult[] ToArray() - => ((ReadOnlySpan)source.AsSpan()).ToArrayAt(selector); + => source.AsReadOnlySpan().ToArrayAt(selector); [MethodImpl(MethodImplOptions.AggressiveInlining)] public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) @@ -216,32 +202,17 @@ public Lease ToArray(ArrayPool pool, bool clearOnDispose = def [MethodImpl(MethodImplOptions.AggressiveInlining)] public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToListAt(selector); + => source.AsReadOnlySpan().ToListAt(selector); #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectAtEnumerable source) - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectAtEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this ArraySegmentSelectAtEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction where TPredicate : struct, IFunction => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectAtEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentSelectAtEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, ArraySegmentSelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this ArraySegmentSelectAtEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs similarity index 92% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs index f299225a0..d4b1152cd 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.AsyncValueEnumerable.cs @@ -12,13 +12,6 @@ namespace NetFabric.Hyperlinq public static partial class AsyncValueEnumerableExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.AsyncFunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectAtEnumerable> Select(this TEnumerable source, Func> selector) - where TEnumerable : IAsyncValueEnumerable - where TEnumerator : struct, IAsyncEnumerator - => source.SelectAt>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectAtEnumerable SelectAt(this TEnumerable source, TSelector selector = default) where TEnumerable : IAsyncValueEnumerable @@ -26,7 +19,6 @@ public static SelectAtEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectAtEnumerable : IAsyncValueEnumerable.Enumerator> @@ -218,20 +210,12 @@ public ValueTask AnyAsync(CancellationToken cancellationToken = default) #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func> selector) - => Select>(new AsyncFunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IAsyncFunction => source.SelectAt>(new AsyncSelectorAtSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func> selector) - => SelectAt>(new AsyncFunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IAsyncFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs similarity index 83% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs index 74f31826f..b67c20fec 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlyMemory.cs @@ -11,7 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemorySelectAtEnumerable> Select(this ReadOnlyMemory source, Func selector) => source.SelectAt>(new FunctionWrapper(selector)); @@ -21,7 +20,6 @@ static MemorySelectAtEnumerable SelectAt => new(source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct MemorySelectAtEnumerable : IValueReadOnlyList.Enumerator> @@ -163,19 +161,6 @@ public MemorySelectAtEnumerable => source.SelectAt>(new SelectorAtSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -207,27 +192,12 @@ public List ToList() #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectAtEnumerable source) - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectAtEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, MemorySelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this MemorySelectAtEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction where TPredicate : struct, IFunction => source.Count(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this MemorySelectAtEnumerable source, Func predicate) - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, MemorySelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this MemorySelectAtEnumerable source, TPredicate predicate = default) where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs similarity index 96% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs index dc30405c3..77490c8b0 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ReadOnlySpan.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanSelectAtEnumerable> Select(this ReadOnlySpan source, Func selector) => source.SelectAt>(new FunctionWrapper(selector)); @@ -19,7 +18,6 @@ static SpanSelectAtEnumerable SelectAt => new(source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public ref struct SpanSelectAtEnumerable where TSelector : struct, IFunction @@ -132,11 +130,6 @@ public bool SequenceEqual(IEnumerable other, IEqualityComparer } } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SpanSelectAtEnumerable source) - where TSelector : struct, IFunction - => source.Count; - // [MethodImpl(MethodImplOptions.AggressiveInlining)] // public static int Count(this SpanSelectAtEnumerable source, Func predicate) // where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs similarity index 86% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs index 524d6dc67..6ce156e76 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueEnumerable.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectAtEnumerable> Select(this TEnumerable source, Func selector) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectAtEnumerable SelectAt(this TEnumerable source, TSelector selector = default) where TEnumerable : IValueEnumerable @@ -25,7 +18,6 @@ public static SelectAtEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectAtEnumerable : IValueEnumerable.Enumerator> @@ -116,31 +108,17 @@ public bool Any() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.SelectAt>(new SelectorAtSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => source.SelectAt>(new SelectorAtSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) where TSubEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs similarity index 78% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs index cfd0e6ca8..98f68523f 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyCollection.cs @@ -11,13 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyCollectionExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectAtEnumerable> Select(this TEnumerable source, Func selector) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => SelectAt>(source, new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectAtEnumerable SelectAt(this TEnumerable source, TSelector selector = default) where TEnumerable : IValueReadOnlyCollection @@ -25,7 +18,6 @@ public static SelectAtEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct SelectAtEnumerable : IValueReadOnlyCollection.Enumerator> @@ -149,38 +141,17 @@ public bool Any() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyCollectionExtensions.SelectAt>(source, new SelectorAtSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyCollectionExtensions.SelectAt>(source, new SelectorAtSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -213,20 +184,6 @@ public List ToList() #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this in SelectAtEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectAtEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => Count, SelectAtEnumerable.Enumerator, TResult>(source, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this SelectAtEnumerable source, TPredicate predicate = default) @@ -236,13 +193,6 @@ public static int Count => Count, SelectAtEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectAtEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => Count, SelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this SelectAtEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs similarity index 81% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs index 6c8435ce8..9d270ce69 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAt.ValueReadOnlyList.cs @@ -11,7 +11,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueReadOnlyListExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectAtEnumerable> Select(this TEnumerable source, Func selector) where TEnumerable : struct, IValueReadOnlyList @@ -25,7 +24,6 @@ public static SelectAtEnumerable => new(in source, selector); - [GeneratorMapping("TSource", "TResult")] [StructLayout(LayoutKind.Auto)] public partial struct SelectAtEnumerable : IValueReadOnlyList.Enumerator> @@ -176,38 +174,17 @@ public void Dispose() #endregion #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select>(new FunctionWrapper(selector)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly SelectAtEnumerable> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyListExtensions.SelectAt>(source, new SelectorAtSelectorCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectAtEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => SelectAt>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly SelectAtEnumerable> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueReadOnlyListExtensions.SelectAt>(source, new SelectorAtSelectorAtCombination(this.selector, selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, FunctionWrapper> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2>(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerableExtensions.SelectManyEnumerable, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2> SelectMany(TSelector2 selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector2 : struct, IFunction - => this.SelectMany, Enumerator, TResult, TSubEnumerable, TSubEnumerator, TResult2, TSelector2>(selector); - #endregion #region Element @@ -247,20 +224,6 @@ public readonly List ToList() #endregion } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this in SelectAtEnumerable source) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectAtEnumerable source, Func predicate) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, SelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int Count(this SelectAtEnumerable source, TPredicate predicate = default) where TEnumerable : struct, IValueReadOnlyList @@ -269,13 +232,6 @@ public static int Count => ValueReadOnlyCollectionExtensions.Count, SelectAtEnumerable.Enumerator, TResult, TPredicate>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this SelectAtEnumerable source, Func predicate) - where TEnumerable : struct, IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => ValueReadOnlyCollectionExtensions.Count, SelectAtEnumerable.Enumerator, TResult>(source, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int CountAt(this SelectAtEnumerable source, TPredicate predicate = default) where TEnumerable : struct, IValueReadOnlyList diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAtEnumerator.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAtEnumerator.cs similarity index 100% rename from NetFabric.Hyperlinq/Projection/Select/SelectAt/SelectAtEnumerator.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectAt/SelectAtEnumerator.cs diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.Range.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.Range.cs similarity index 99% rename from NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.Range.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.Range.cs index db1b3deda..9da26df94 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.Range.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.Range.cs @@ -30,7 +30,7 @@ static RangeSelectVectorContext SelectVecto where TResult : struct => new(start, count, vectorSelector, selector); - [GeneratorIgnore] + [StructLayout(LayoutKind.Auto)] public partial struct RangeSelectVectorContext where TVectorSelector : struct, IFunction, Vector> diff --git a/NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs similarity index 99% rename from NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs index a3a7aee03..63532d693 100644 --- a/NetFabric.Hyperlinq/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Projection/Select/SelectVector/SelectVector.ReadOnlySpan.cs @@ -10,14 +10,12 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore(true)] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanSelectVectorContext, Vector>, FunctionWrapper> SelectVector(this ReadOnlySpan source, Func, Vector> vectorSelector, Func selector) where TSource : struct where TResult : struct => source.SelectVector, Vector>, FunctionWrapper>(new FunctionWrapper, Vector>(vectorSelector), new FunctionWrapper(selector)); - [GeneratorIgnore(true)] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanSelectVectorContext SelectVector(this ReadOnlySpan source, TSelector selector = default) where TSelector : struct, IFunction, Vector>, IFunction diff --git a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs similarity index 88% rename from NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs index 0bd25b721..0ff7c776a 100644 --- a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ArraySegment.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq { public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static ArraySegmentSelectManyEnumerable> SelectMany(this in ArraySegment source, Func selector) where TSubEnumerable : IValueEnumerable @@ -23,7 +22,7 @@ static ArraySegmentSelectManyEnumerable => new(source, selector); - [GeneratorIgnore] + [StructLayout(LayoutKind.Auto)] public readonly partial struct ArraySegmentSelectManyEnumerable : IValueEnumerable.Enumerator> @@ -131,19 +130,11 @@ public int Count() public bool Any() => this.Any, Enumerator, TResult>(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate predicate = default) where TPredicate : struct, IFunction => this.Any, Enumerator, TResult, TPredicate>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -152,19 +143,11 @@ public bool AnyAt(TPredicate predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, TPredicate> WhereAt(TPredicate predicate = default) where TPredicate : struct, IFunction => ValueEnumerableExtensions.WhereAt, Enumerator, TResult, TPredicate>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TPredicate> Where(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -173,19 +156,11 @@ public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectEnumerable, Enumerator, TResult, TResult2, TSelector2> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2, TSelector2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.SelectAtEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectAtEnumerable, Enumerator, TResult, TResult2, TSelector2> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs similarity index 88% rename from NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs index 5fa18194b..fa71360ee 100644 --- a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlyMemory.cs @@ -10,7 +10,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static MemorySelectManyEnumerable> SelectMany(this in ReadOnlyMemory source, Func selector) where TSubEnumerable : IValueEnumerable @@ -24,7 +23,7 @@ static MemorySelectManyEnumerable => new(source, selector); - [GeneratorIgnore] + [StructLayout(LayoutKind.Auto)] public readonly partial struct MemorySelectManyEnumerable : IValueEnumerable.Enumerator> @@ -130,19 +129,11 @@ public int Count() public bool Any() => this.Any, Enumerator, TResult>(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate predicate = default) where TPredicate : struct, IFunction => this.Any, Enumerator, TResult, TPredicate>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -151,19 +142,11 @@ public bool AnyAt(TPredicate predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereAtEnumerable, Enumerator, TResult, TPredicate> WhereAt(TPredicate predicate = default) where TPredicate : struct, IFunction => ValueEnumerableExtensions.WhereAt, Enumerator, TResult, TPredicate>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TPredicate> Where(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -172,19 +155,11 @@ public ValueEnumerableExtensions.WhereEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectEnumerable, Enumerator, TResult, TResult2, TSelector2> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2, TSelector2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerableExtensions.SelectAtEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public ValueEnumerableExtensions.SelectAtEnumerable, Enumerator, TResult, TResult2, TSelector2> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction diff --git a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs similarity index 99% rename from NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs index 6f7bff87a..32ba6343b 100644 --- a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ReadOnlySpan.cs @@ -9,7 +9,6 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] [MethodImpl(MethodImplOptions.AggressiveInlining)] static SpanSelectManyEnumerable> SelectMany(this ReadOnlySpan source, Func selector) where TSubEnumerable : IValueEnumerable @@ -23,7 +22,7 @@ static SpanSelectManyEnumerable => new(source, selector); - [GeneratorIgnore] + [StructLayout(LayoutKind.Auto)] public readonly ref struct SpanSelectManyEnumerable where TSubEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs similarity index 86% rename from NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs index bc5c33140..b07960280 100644 --- a/NetFabric.Hyperlinq/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueEnumerable.cs @@ -10,15 +10,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SelectManyEnumerable> SelectMany(this TEnumerable source, Func selector) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => source.SelectMany>(new FunctionWrapper(selector)); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SelectManyEnumerable SelectMany(this TEnumerable source, TSelector selector = default) where TEnumerable : IValueEnumerable @@ -28,7 +19,7 @@ public static SelectManyEnumerable => new(source, selector); - [GeneratorIgnore] + [StructLayout(LayoutKind.Auto)] public readonly partial struct SelectManyEnumerable : IValueEnumerable.Enumerator> @@ -132,19 +123,11 @@ public int Count() public bool Any() => this.Any, Enumerator, TResult>(); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Any(TPredicate predicate = default) where TPredicate : struct, IFunction => this.Any, Enumerator, TResult, TPredicate>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => this.Any, Enumerator, TResult>(predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool AnyAt(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -153,19 +136,11 @@ public bool AnyAt(TPredicate predicate = default) #endregion #region Filtering - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereAtEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereAtEnumerable, Enumerator, TResult, TPredicate> WhereAt(TPredicate predicate = default) where TPredicate : struct, IFunction => ValueEnumerableExtensions.WhereAt, Enumerator, TResult, TPredicate>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public WhereEnumerable, Enumerator, TResult, FunctionWrapper> Where(Func predicate) - => ValueEnumerableExtensions.Where, Enumerator, TResult>(this, predicate); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public WhereEnumerable, Enumerator, TResult, TPredicate> Where(TPredicate predicate = default) where TPredicate : struct, IFunction @@ -174,19 +149,11 @@ public WhereEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectEnumerable, Enumerator, TResult, TResult2, TSelector2> Select(TSelector2 selector = default) where TSelector2 : struct, IFunction => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2, TSelector2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SelectAtEnumerable, Enumerator, TResult, TResult2, FunctionWrapper> Select(Func selector) - => ValueEnumerableExtensions.Select, Enumerator, TResult, TResult2>(this, selector); - [MethodImpl(MethodImplOptions.AggressiveInlining)] public SelectAtEnumerable, Enumerator, TResult, TResult2, TSelector2> SelectAt(TSelector2 selector = default) where TSelector2 : struct, IFunction diff --git a/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyCollection.cs new file mode 100644 index 000000000..b171a53c8 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyCollection.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadonlyCollectionExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueEnumerableExtensions.SelectManyEnumerable SelectMany(this TEnumerable source, TSelector selector = default) + where TEnumerable : IValueReadOnlyCollection + where TEnumerator : struct, IEnumerator + where TSubEnumerable : IValueEnumerable + where TSubEnumerator : struct, IEnumerator + where TSelector : struct, IFunction + => ValueEnumerableExtensions.SelectMany(source, selector); + } +} + diff --git a/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyList.cs new file mode 100644 index 000000000..2425f25bb --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Projection/SelectMany/SelectMany/SelectMany.ValueReadOnlyList.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadonlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueEnumerableExtensions.SelectManyEnumerable SelectMany(this TEnumerable source, TSelector selector = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TSubEnumerable : IValueEnumerable + where TSubEnumerator : struct, IEnumerator + where TSelector : struct, IFunction + => ValueEnumerableExtensions.SelectMany(source, selector); + } +} + diff --git a/NetFabric.Hyperlinq.Core/Properties/AssemblyInfo.cs b/NetFabric.Hyperlinq.Core/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..c1bd8a3cf --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly:InternalsVisibleTo("NetFabric.Hyperlinq.Core.UnitTests")] \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Quantifier/All/All.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ReadOnlySpan.cs similarity index 100% rename from NetFabric.Hyperlinq/Quantifier/All/All.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Quantifier/All/All.ReadOnlySpan.cs diff --git a/NetFabric.Hyperlinq/Quantifier/All/All.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueEnumerable.cs similarity index 61% rename from NetFabric.Hyperlinq/Quantifier/All/All.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueEnumerable.cs index a43bc4eeb..356f3c912 100644 --- a/NetFabric.Hyperlinq/Quantifier/All/All.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueEnumerable.cs @@ -7,12 +7,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool All(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.All>(new FunctionWrapper(predicate)); - public static bool All(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -26,13 +20,6 @@ public static bool All(this TEnum } return true; } - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool All(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.AllAt>(new FunctionWrapper(predicate)); public static bool AllAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable diff --git a/NetFabric.Hyperlinq/Quantifier/All/All.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyCollection.cs similarity index 57% rename from NetFabric.Hyperlinq/Quantifier/All/All.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyCollection.cs index 7eb86823a..b1abcc6b7 100644 --- a/NetFabric.Hyperlinq/Quantifier/All/All.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyCollection.cs @@ -6,12 +6,6 @@ namespace NetFabric.Hyperlinq { public static partial class ValueReadOnlyCollectionExtensions { - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool All(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => All>(source, new FunctionWrapper(predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool All(this TEnumerable source, TPredicate predicate = default) @@ -19,12 +13,6 @@ public static bool All(this TEnum where TEnumerator : struct, IEnumerator where TPredicate : struct, IFunction => source.Count is 0 || ValueEnumerableExtensions.All(source, predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool All(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => AllAt>(source, new FunctionWrapper(predicate)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool AllAt(this TEnumerable source, TPredicate predicate = default) diff --git a/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyList.cs new file mode 100644 index 000000000..d94386393 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Quantifier/All/All.ValueReadOnlyList.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool All(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.All(source, predicate); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool AllAt(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.AllAt(source, predicate); + } +} + diff --git a/NetFabric.Hyperlinq/Quantifier/All/AllAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/All/AllAsync.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Quantifier/All/AllAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/All/AllAsync.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Quantifier/Any/Any.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ReadOnlySpan.cs similarity index 100% rename from NetFabric.Hyperlinq/Quantifier/Any/Any.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ReadOnlySpan.cs diff --git a/NetFabric.Hyperlinq/Quantifier/Any/Any.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueEnumerable.cs similarity index 66% rename from NetFabric.Hyperlinq/Quantifier/Any/Any.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueEnumerable.cs index 6cfd4c202..985603f09 100644 --- a/NetFabric.Hyperlinq/Quantifier/Any/Any.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueEnumerable.cs @@ -15,12 +15,6 @@ public static bool Any(this TEnumerable sourc return enumerator.MoveNext(); } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.Any>(new FunctionWrapper(predicate)); - public static bool Any(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -35,12 +29,6 @@ public static bool Any(this TEnum return false; } - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.AnyAt>(new FunctionWrapper(predicate)); - public static bool AnyAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyCollection.cs similarity index 78% rename from NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyCollection.cs index 49d4c1145..5dad306eb 100644 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyCollection.cs @@ -14,17 +14,18 @@ public static bool Any(this TEnumerable sourc => source.Count is not 0; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, Func predicate) + public static bool Any(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator - => Any>(source, new FunctionWrapper(predicate)); + where TPredicate : struct, IFunction + => source.Count is not 0 && ValueEnumerableExtensions.Any(source, predicate); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, TPredicate predicate = default) + public static bool AnyAt(this TEnumerable source, TPredicate predicate = default) where TEnumerable : IValueReadOnlyCollection where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.Count is not 0 && ValueEnumerableExtensions.Any(source, predicate); + where TPredicate : struct, IFunction + => source.Count is not 0 && ValueEnumerableExtensions.AnyAt(source, predicate); } } diff --git a/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyList.cs new file mode 100644 index 000000000..d2df510ab --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Quantifier/Any/Any.ValueReadOnlyList.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Any(this TEnumerable source) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Any(source); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Any(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.Any(source, predicate); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool AnyAt(this TEnumerable source, TPredicate predicate = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + where TPredicate : struct, IFunction + => ValueReadOnlyCollectionExtensions.AnyAt(source, predicate); + } +} + diff --git a/NetFabric.Hyperlinq/Quantifier/Any/AnyAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/Any/AnyAsync.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Quantifier/Any/AnyAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Any/AnyAsync.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.Enumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.Enumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Quantifier/Contains/Contains.Enumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.Enumerable.cs index 0d061f9d6..052400a66 100644 --- a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.Enumerable.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.Enumerable.cs @@ -4,7 +4,7 @@ namespace NetFabric.Hyperlinq { public static partial class EnumerableExtensions { - [GeneratorIgnore] + internal static bool Contains(this TEnumerable source, TSource value, IEqualityComparer? comparer = default) where TEnumerable : IEnumerable { @@ -44,7 +44,7 @@ static bool ComparerContains(TEnumerable source, TSource value, IEqualityCompare } } - [GeneratorIgnore] + internal static bool Contains(this TEnumerable source, TEnumeratorGenerator getEnumerator, TSource value, IEqualityComparer? comparer = default) where TEnumerable : IEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ReadOnlySpan.cs similarity index 98% rename from NetFabric.Hyperlinq/Quantifier/Contains/Contains.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ReadOnlySpan.cs index 767f1619b..67fcb78d4 100644 --- a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ReadOnlySpan.cs @@ -37,7 +37,7 @@ static bool ReferenceContains(ReadOnlySpan source, TSource value, IEqua } } - [GeneratorIgnore] + static bool Contains(this ReadOnlySpan source, TResult value, IEqualityComparer? comparer, TSelector selector) where TSelector : struct, IFunction { @@ -71,7 +71,7 @@ static bool ReferenceContains(ReadOnlySpan source, TResult value, IEqua } } - [GeneratorIgnore] + static bool ContainsAt(this ReadOnlySpan source, TResult value, IEqualityComparer? comparer, TSelector selector) where TSelector : struct, IFunction { diff --git a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueEnumerable.cs similarity index 98% rename from NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueEnumerable.cs index 6f5605ad9..0540ec1b5 100644 --- a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueEnumerable.cs @@ -45,7 +45,7 @@ static bool ComparerContains(TEnumerable source, TSource value, IEqualityCompare } - [GeneratorIgnore] + internal static bool Contains(this TEnumerable source, TResult value, IEqualityComparer? comparer, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -80,7 +80,7 @@ static bool ReferenceContains(TEnumerable source, TResult value, IEqualityCompar } } - [GeneratorIgnore] + internal static bool ContainsAt(this TEnumerable source, TResult value, IEqualityComparer? comparer, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs similarity index 97% rename from NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs index 080b9a4f3..4c4e1e62e 100644 --- a/NetFabric.Hyperlinq/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyCollection.cs @@ -11,7 +11,7 @@ public static bool Contains(this TEnumerable where TEnumerator : struct, IEnumerator => source.Count is not 0 && ValueEnumerableExtensions.Contains(source, value, comparer); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool Contains(this TEnumerable source, TResult value, IEqualityComparer? comparer, TSelector selector) where TEnumerable : IValueReadOnlyCollection @@ -19,7 +19,7 @@ internal static bool Contains => source.Count is not 0 && ValueEnumerableExtensions.Contains(source, value, comparer, selector); - [GeneratorIgnore] + [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool ContainsAt(this TEnumerable source, TResult value, IEqualityComparer? comparer, TSelector selector) where TEnumerable : IValueReadOnlyCollection diff --git a/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyList.cs new file mode 100644 index 000000000..fd94cdc4d --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Quantifier/Contains/Contains.ValueReadOnlyList.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool Contains(this TEnumerable source, TSource value, IEqualityComparer? comparer = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Contains(source, value, comparer); + } +} diff --git a/NetFabric.Hyperlinq/Quantifier/Contains/ContainsAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Quantifier/Contains/ContainsAsync.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Quantifier/Contains/ContainsAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Quantifier/Contains/ContainsAsync.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs similarity index 98% rename from NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs index 516503ef2..11c7e6beb 100644 --- a/NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.ReadOnlySpan.cs @@ -34,7 +34,7 @@ static bool ContainsVector(this ReadOnlySpan source, TSource v return false; } - [GeneratorIgnore] + static bool ContainsVector(this ReadOnlySpan source, TResult value, TVectorSelector vectorSelector, TSelector selector) where TVectorSelector : struct, IFunction, Vector> where TSelector : struct, IFunction diff --git a/NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.Span.cs b/NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.Span.cs similarity index 82% rename from NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.Span.cs rename to NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.Span.cs index 9dbfc7401..0bfe618fe 100644 --- a/NetFabric.Hyperlinq/Quantifier/ContainsVector/ContainsVector.Span.cs +++ b/NetFabric.Hyperlinq.Core/Quantifier/ContainsVector/ContainsVector.Span.cs @@ -9,7 +9,7 @@ public static partial class ArrayExtensions [MethodImpl(MethodImplOptions.AggressiveInlining)] static bool ContainsVector(this Span source, TSource value) where TSource : struct - => ((ReadOnlySpan)source).ContainsVector(value); + => source.AsReadOnlySpan().ContainsVector(value); } } diff --git a/NetFabric.Hyperlinq.Core/Resource.Designer.cs b/NetFabric.Hyperlinq.Core/Resource.Designer.cs new file mode 100644 index 000000000..ff4ee5dc4 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Resource.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace NetFabric.Hyperlinq { + using System; + + + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resource { + + private static System.Resources.ResourceManager resourceMan; + + private static System.Globalization.CultureInfo resourceCulture; + + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resource() { + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Resources.ResourceManager ResourceManager { + get { + if (object.Equals(null, resourceMan)) { + System.Resources.ResourceManager temp = new System.Resources.ResourceManager("NetFabric.Hyperlinq.Resource", typeof(Resource).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)] + internal static System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + internal static string ArraySegmentNull { + get { + return ResourceManager.GetString("ArraySegmentNull", resourceCulture); + } + } + + internal static string DestinationNotLongEnough { + get { + return ResourceManager.GetString("DestinationNotLongEnough", resourceCulture); + } + } + + internal static string EmptySequence { + get { + return ResourceManager.GetString("EmptySequence", resourceCulture); + } + } + + internal static string NotSingleSequence { + get { + return ResourceManager.GetString("NotSingleSequence", resourceCulture); + } + } + } +} diff --git a/NetFabric.Hyperlinq.Core/Resource.resx b/NetFabric.Hyperlinq.Core/Resource.resx new file mode 100644 index 000000000..05b1efb3f --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Resource.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + The array in the ArraySegment is null + + + Destination array was not long enough. Check the destination index, length, and the array's lower bounds. + + + Sequence contains no elements + + + Sequence contains more than one element + + \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ArraySegment.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ArraySegment.cs similarity index 58% rename from NetFabric.Hyperlinq/Set/Distinct/Distinct.ArraySegment.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ArraySegment.cs index 8a2511cfc..ffbe3f74b 100644 --- a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ArraySegment.cs +++ b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ArraySegment.cs @@ -148,62 +148,6 @@ public List ToList() #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, int, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, int?, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, nint, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, nint?, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, nuint, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, nuint?, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, long, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, long?, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, float, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, float?, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, double, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, double?, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, decimal, decimal>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ArraySegmentDistinctEnumerable source) - => source.Sum, ArraySegmentDistinctEnumerable.Enumerator, decimal?, decimal>(); } } diff --git a/NetFabric.Hyperlinq/Set/Distinct/Distinct.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.AsyncValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Set/Distinct/Distinct.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.AsyncValueEnumerable.cs diff --git a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ReadOnlyMemory.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ReadOnlyMemory.cs similarity index 59% rename from NetFabric.Hyperlinq/Set/Distinct/Distinct.ReadOnlyMemory.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ReadOnlyMemory.cs index d028c5864..9a7d0fbd2 100644 --- a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ReadOnlyMemory.cs +++ b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ReadOnlyMemory.cs @@ -146,62 +146,6 @@ public List ToList() #endregion } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, int, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, int?, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, nint, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, nint?, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, nuint, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, nuint?, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, long, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, long?, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, float, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, float?, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, double, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, double?, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, decimal, decimal>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this MemoryDistinctEnumerable source) - => source.Sum, MemoryDistinctEnumerable.Enumerator, decimal?, decimal>(); } } diff --git a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ReadOnlySpan.cs similarity index 100% rename from NetFabric.Hyperlinq/Set/Distinct/Distinct.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ReadOnlySpan.cs diff --git a/NetFabric.Hyperlinq/Set/Distinct/Distinct.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueEnumerable.cs similarity index 100% rename from NetFabric.Hyperlinq/Set/Distinct/Distinct.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueEnumerable.cs diff --git a/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyCollection.cs new file mode 100644 index 000000000..bac8fe6d2 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyCollection.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyCollectionExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueEnumerableExtensions.DistinctEnumerable Distinct( + this TEnumerable source, + IEqualityComparer? comparer = default) + where TEnumerable : IValueReadOnlyCollection + where TEnumerator : struct, IEnumerator + => ValueEnumerableExtensions.Distinct(source, comparer); + } +} + diff --git a/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyList.cs new file mode 100644 index 000000000..dc8954e86 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Set/Distinct/Distinct.ValueReadOnlyList.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + public static partial class ValueReadOnlyListExtensions + { + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueEnumerableExtensions.DistinctEnumerable Distinct( + this TEnumerable source, + IEqualityComparer? comparer = default) + where TEnumerable : IValueReadOnlyList + where TEnumerator : struct, IEnumerator + => ValueReadOnlyCollectionExtensions.Distinct(source, comparer); + } +} + diff --git a/NetFabric.Hyperlinq/Set/Distinct/Set.cs b/NetFabric.Hyperlinq.Core/Set/Distinct/Set.cs similarity index 100% rename from NetFabric.Hyperlinq/Set/Distinct/Set.cs rename to NetFabric.Hyperlinq.Core/Set/Distinct/Set.cs diff --git a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ArrayBuilder.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ArrayBuilder.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/ArrayBuilder/ArrayBuilder.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ArrayBuilder.cs diff --git a/NetFabric.Hyperlinq/Utils/ArrayBuilder/LargeArrayBuilder.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/LargeArrayBuilder.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/ArrayBuilder/LargeArrayBuilder.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/LargeArrayBuilder.cs diff --git a/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlyList.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlyList.cs new file mode 100644 index 000000000..585f4adc3 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlyList.cs @@ -0,0 +1,70 @@ +using System.Buffers; +using System.Collections.Generic; + +namespace NetFabric.Hyperlinq +{ + public static partial class ReadOnlyListExtensions + { + + + static LargeArrayBuilder ToArrayBuilder(in TList source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, int offset, int count) + where TList : struct, IReadOnlyList + where TPredicate: struct, IFunction + { + var builder = new LargeArrayBuilder(pool, clearOnDispose); + var end = offset + count; + for (var index = offset; index < end; index++) + { + var item = source[index]; + if (predicate.Invoke(item)) + builder.Add(item); + } + return builder; + } + + + static LargeArrayBuilder ToArrayBuilderAt(in TList source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, int offset, int count) + where TList : struct, IReadOnlyList + where TPredicate: struct, IFunction + { + var builder = new LargeArrayBuilder(pool, clearOnDispose); + var end = count; + if (offset is 0) + { + for (var index = 0; index < end; index++) + { + var item = source[index]; + if (predicate.Invoke(item, index)) + builder.Add(item); + } + } + else + { + for (var index = 0; index < end; index++) + { + var item = source[index + offset]; + if (predicate.Invoke(item, index)) + builder.Add(item); + } + } + return builder; + } + + + static LargeArrayBuilder ToArrayBuilder(in TList source, ArrayPool pool, bool clearOnDispose, TPredicate predicate, TSelector selector, int offset, int count) + where TList : struct, IReadOnlyList + where TSelector: struct, IFunction + where TPredicate: struct, IFunction + { + var builder = new LargeArrayBuilder(pool, clearOnDispose); + var end = offset + count; + for (var index = offset; index < end; index++) + { + var item = source[index]; + if (predicate.Invoke(item)) + builder.Add(selector.Invoke(item)); + } + return builder; + } + } +} diff --git a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs similarity index 96% rename from NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs index 4bf675d81..558e23fff 100644 --- a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs +++ b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ReadOnlySpan.cs @@ -6,7 +6,7 @@ namespace NetFabric.Hyperlinq public static partial class ArrayExtensions { - [GeneratorIgnore] + static LargeArrayBuilder ToArrayBuilder(ReadOnlySpan source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate) where TPredicate: struct, IFunction { @@ -19,7 +19,7 @@ static LargeArrayBuilder ToArrayBuilder(ReadOnlySp return builder; } - [GeneratorIgnore] + static LargeArrayBuilder ToArrayBuilderAt(ReadOnlySpan source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate) where TPredicate: struct, IFunction { @@ -33,7 +33,7 @@ static LargeArrayBuilder ToArrayBuilderAt(ReadOnly return builder; } - [GeneratorIgnore] + static LargeArrayBuilder ToArrayBuilder(ReadOnlySpan source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate, TSelector selector) where TPredicate: struct, IFunction where TSelector: struct, IFunction diff --git a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs similarity index 96% rename from NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs index 4729f52c6..c85c6972c 100644 --- a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilder.ValueEnumerable.cs @@ -6,7 +6,6 @@ namespace NetFabric.Hyperlinq public static partial class ValueEnumerableExtensions { - [GeneratorIgnore] internal static LargeArrayBuilder ToArrayBuilder(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -21,7 +20,7 @@ internal static LargeArrayBuilder ToArrayBuilder ToArrayBuilder(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -38,7 +37,7 @@ static LargeArrayBuilder ToArrayBuilder ToArrayBuilderAt(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -55,7 +54,7 @@ static LargeArrayBuilder ToArrayBuilderAt ToArrayBuilder(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -71,7 +70,7 @@ static LargeArrayBuilder ToArrayBuilder ToArrayBuilderAt(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator @@ -90,7 +89,7 @@ static LargeArrayBuilder ToArrayBuilderAt ToArrayBuilder(TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, TPredicate predicate, TSelector selector) where TEnumerable : IValueEnumerable where TEnumerator : struct, IEnumerator diff --git a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs similarity index 97% rename from NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs index 4faaf8995..f4e6689a5 100644 --- a/NetFabric.Hyperlinq/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs +++ b/NetFabric.Hyperlinq.Core/Utils/ArrayBuilder/ToArrayBuilderAsync.AsyncValueEnumerable.cs @@ -7,7 +7,7 @@ namespace NetFabric.Hyperlinq { public static partial class AsyncValueEnumerableExtensions { - [GeneratorIgnore] + static async ValueTask> ToArrayBuilderAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -29,7 +29,7 @@ static async ValueTask> ToArrayBuilderAsync> ToArrayBuilderAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -55,7 +55,7 @@ static async ValueTask> ToArrayBuilderAsync> ToArrayBuilderAtAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -84,7 +84,7 @@ static async ValueTask> ToArrayBuilderAtAsync> ToArrayBuilderAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -108,7 +108,7 @@ static async ValueTask> ToArrayBuilderAsync> ToArrayBuilderAtAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator @@ -135,7 +135,7 @@ static async ValueTask> ToArrayBuilderAtAsync> ToArrayBuilderAsync(this TEnumerable source, ArrayPool arrayPool, bool clearOnDispose, CancellationToken cancellationToken, TPredicate predicate, TSelector selector) where TEnumerable : IAsyncValueEnumerable where TEnumerator : struct, IAsyncEnumerator diff --git a/NetFabric.Hyperlinq.Core/Utils/ArrayExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayExtensions.cs new file mode 100644 index 000000000..bdaa467ae --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Utils/ArrayExtensions.cs @@ -0,0 +1,16 @@ +using System; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + static class InternalArrayExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlySpan AsReadOnlySpan(this T[] source) + => source; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlyMemory AsReadOnlyMemory(this T[] source) + => source; + } +} diff --git a/NetFabric.Hyperlinq/Utils/ArrayPoolExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/ArrayPoolExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/ArrayPoolExtensions.cs rename to NetFabric.Hyperlinq.Core/Utils/ArrayPoolExtensions.cs diff --git a/NetFabric.Hyperlinq/Utils/ArraySegmentExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/ArraySegmentExtensions.cs similarity index 70% rename from NetFabric.Hyperlinq/Utils/ArraySegmentExtensions.cs rename to NetFabric.Hyperlinq.Core/Utils/ArraySegmentExtensions.cs index 30acec5f6..69fed9d4a 100644 --- a/NetFabric.Hyperlinq/Utils/ArraySegmentExtensions.cs +++ b/NetFabric.Hyperlinq.Core/Utils/ArraySegmentExtensions.cs @@ -12,7 +12,10 @@ public static bool IsEmpty(this in ArraySegment source) // NOTE: Inner array can only be null if length is zero. Should validate before calling this method. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsWhole(this in ArraySegment source) - => source.Count == source.Array!.Length; + => source.Count == source.Array!.Length; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlySpan AsReadOnlySpan(this in ArraySegment source) + => source.AsSpan(); } } diff --git a/NetFabric.Hyperlinq/Utils/BooleanExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/BooleanExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/BooleanExtensions.cs rename to NetFabric.Hyperlinq.Core/Utils/BooleanExtensions.cs diff --git a/NetFabric.Hyperlinq/Utils/Copy/Copy.Range.cs b/NetFabric.Hyperlinq.Core/Utils/Copy/Copy.Range.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Copy/Copy.Range.cs rename to NetFabric.Hyperlinq.Core/Utils/Copy/Copy.Range.cs diff --git a/NetFabric.Hyperlinq/Utils/Copy/Copy.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Utils/Copy/Copy.ReadOnlySpan.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Copy/Copy.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Utils/Copy/Copy.ReadOnlySpan.cs diff --git a/NetFabric.Hyperlinq/Utils/Copy/Copy.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Utils/Copy/Copy.ValueReadOnlyCollection.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Copy/Copy.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Utils/Copy/Copy.ValueReadOnlyCollection.cs diff --git a/NetFabric.Hyperlinq/Utils/Default.cs b/NetFabric.Hyperlinq.Core/Utils/Default.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Default.cs rename to NetFabric.Hyperlinq.Core/Utils/Default.cs diff --git a/NetFabric.Hyperlinq/Utils/EnumeratorState.cs b/NetFabric.Hyperlinq.Core/Utils/EnumeratorState.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/EnumeratorState.cs rename to NetFabric.Hyperlinq.Core/Utils/EnumeratorState.cs diff --git a/NetFabric.Hyperlinq/Utils/FunctionCombination/AsyncPredicateCombination.cs b/NetFabric.Hyperlinq.Core/Utils/FunctionCombination/AsyncPredicateCombination.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/FunctionCombination/AsyncPredicateCombination.cs rename to NetFabric.Hyperlinq.Core/Utils/FunctionCombination/AsyncPredicateCombination.cs diff --git a/NetFabric.Hyperlinq/Utils/FunctionCombination/AsyncSelectorCombination.cs b/NetFabric.Hyperlinq.Core/Utils/FunctionCombination/AsyncSelectorCombination.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/FunctionCombination/AsyncSelectorCombination.cs rename to NetFabric.Hyperlinq.Core/Utils/FunctionCombination/AsyncSelectorCombination.cs diff --git a/NetFabric.Hyperlinq/Utils/FunctionCombination/PredicateCombination.cs b/NetFabric.Hyperlinq.Core/Utils/FunctionCombination/PredicateCombination.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/FunctionCombination/PredicateCombination.cs rename to NetFabric.Hyperlinq.Core/Utils/FunctionCombination/PredicateCombination.cs diff --git a/NetFabric.Hyperlinq/Utils/FunctionCombination/PredicateInCombination.cs b/NetFabric.Hyperlinq.Core/Utils/FunctionCombination/PredicateInCombination.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/FunctionCombination/PredicateInCombination.cs rename to NetFabric.Hyperlinq.Core/Utils/FunctionCombination/PredicateInCombination.cs diff --git a/NetFabric.Hyperlinq/Utils/FunctionCombination/SelectorCombination.cs b/NetFabric.Hyperlinq.Core/Utils/FunctionCombination/SelectorCombination.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/FunctionCombination/SelectorCombination.cs rename to NetFabric.Hyperlinq.Core/Utils/FunctionCombination/SelectorCombination.cs diff --git a/NetFabric.Hyperlinq/Utils/IndexOf/IndexOf.ReadOnlySpan.cs b/NetFabric.Hyperlinq.Core/Utils/IndexOf/IndexOf.ReadOnlySpan.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/IndexOf/IndexOf.ReadOnlySpan.cs rename to NetFabric.Hyperlinq.Core/Utils/IndexOf/IndexOf.ReadOnlySpan.cs diff --git a/NetFabric.Hyperlinq/Utils/IndexOf/IndexOf.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq.Core/Utils/IndexOf/IndexOf.ValueReadOnlyCollection.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/IndexOf/IndexOf.ValueReadOnlyCollection.cs rename to NetFabric.Hyperlinq.Core/Utils/IndexOf/IndexOf.ValueReadOnlyCollection.cs diff --git a/NetFabric.Hyperlinq/Utils/IntExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/IntExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/IntExtensions.cs rename to NetFabric.Hyperlinq.Core/Utils/IntExtensions.cs diff --git a/NetFabric.Hyperlinq.Core/Utils/MemoryExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/MemoryExtensions.cs new file mode 100644 index 000000000..99cfc73b2 --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Utils/MemoryExtensions.cs @@ -0,0 +1,12 @@ +using System; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + static class MemoryExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlyMemory AsReadOnlyMemory(this Memory source) + => source; + } +} diff --git a/NetFabric.Hyperlinq/Utils/Scalar.cs b/NetFabric.Hyperlinq.Core/Utils/Scalar.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Scalar.cs rename to NetFabric.Hyperlinq.Core/Utils/Scalar.cs diff --git a/NetFabric.Hyperlinq.Core/Utils/SpanExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/SpanExtensions.cs new file mode 100644 index 000000000..07b150b9e --- /dev/null +++ b/NetFabric.Hyperlinq.Core/Utils/SpanExtensions.cs @@ -0,0 +1,12 @@ +using System; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq +{ + static class SpanExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ReadOnlySpan AsReadOnlySpan(this Span source) + => source; + } +} diff --git a/NetFabric.Hyperlinq/Utils/Throw.cs b/NetFabric.Hyperlinq.Core/Utils/Throw.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Throw.cs rename to NetFabric.Hyperlinq.Core/Utils/Throw.cs diff --git a/NetFabric.Hyperlinq/Utils/ThrowIfArgument.cs b/NetFabric.Hyperlinq.Core/Utils/ThrowIfArgument.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/ThrowIfArgument.cs rename to NetFabric.Hyperlinq.Core/Utils/ThrowIfArgument.cs diff --git a/NetFabric.Hyperlinq/Utils/Utils.AllocateUninitializedArray.cs b/NetFabric.Hyperlinq.Core/Utils/Utils.AllocateUninitializedArray.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Utils.AllocateUninitializedArray.cs rename to NetFabric.Hyperlinq.Core/Utils/Utils.AllocateUninitializedArray.cs diff --git a/NetFabric.Hyperlinq/Utils/Utils.EqualityComparer.cs b/NetFabric.Hyperlinq.Core/Utils/Utils.EqualityComparer.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Utils.EqualityComparer.cs rename to NetFabric.Hyperlinq.Core/Utils/Utils.EqualityComparer.cs diff --git a/NetFabric.Hyperlinq/Utils/Utils.SkipTake.cs b/NetFabric.Hyperlinq.Core/Utils/Utils.SkipTake.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/Utils.SkipTake.cs rename to NetFabric.Hyperlinq.Core/Utils/Utils.SkipTake.cs diff --git a/NetFabric.Hyperlinq/Utils/VectorExtensions.cs b/NetFabric.Hyperlinq.Core/Utils/VectorExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq/Utils/VectorExtensions.cs rename to NetFabric.Hyperlinq.Core/Utils/VectorExtensions.cs diff --git a/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj b/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj deleted file mode 100644 index f433a0dbc..000000000 --- a/NetFabric.Hyperlinq.Immutable/NetFabric.Hyperlinq.Immutable.csproj +++ /dev/null @@ -1,55 +0,0 @@ - - - - netstandard2.0 - NetFabric.Hyperlinq.Immutable - NetFabric.Hyperlinq.Immutable - High performance LINQ implementation with minimal heap allocations. Supports all collections in System.Collections.Immutable. - 1.0.0-beta01 - Icon.png - LICENSE - netfabric, hyperlinq, linq, enumeration, extensions, performance - true - - - - - - - - - - - - - - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - all - runtime; build; native; contentfiles; analyzers - - - all - runtime; build; native; contentfiles; analyzers - - - - - - - - - - - - - - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs deleted file mode 100644 index 1bf2b271d..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/CollectExtensionMethodsTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Microsoft.CodeAnalysis; -using NetFabric.Assertive; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests -{ - public class CollectExtensionMethodsTests - { - public static TheoryData ExtensionMethods - => new() - { - { new[] { "TestData/Source/NoExtensionMethods.cs" }, 0 }, - { new[] { "TestData/Source/ExtensionMethods.cs" }, 3 }, - - { new[] { "TestData/Source/Distinct.ArraySegment.cs" }, 1}, - { new[] { "TestData/Source/Count.ValueEnumerable.cs" }, 1 }, - { new[] { "TestData/Source/Distinct.ValueEnumerable.cs" }, 1 }, - - { new[] { "TestData/Source/Where.ArraySegment.cs" }, 2 }, - { new[] { "TestData/Source/Select.ArraySegment.cs" }, 2 }, - { new[] { "TestData/Source/Where.ValueEnumerable.cs" }, 2 }, - { new[] { "TestData/Source/Select.ValueEnumerable.cs" }, 2 }, - }; - - [Theory] - [MemberData(nameof(ExtensionMethods))] - public async Task ShouldCollectExpectedNumberOfExtensionMethods(string[] paths, int expected) - { - // Arrange - var generator = new OverloadsGenerator(); - var project = Verifier.CreateProject( - paths - .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories)) - .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories)) - .Select(path => File.ReadAllText(path))); - var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!")); - - // Act - var result = generator.CollectExtensionMethods(context); - - // Assert - _ = result.Count.Must() - .BeEqualTo(expected); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs deleted file mode 100644 index 44078968f..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/GenerateSourceTests.cs +++ /dev/null @@ -1,241 +0,0 @@ -using Microsoft.CodeAnalysis; -using NetFabric.Assertive; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests -{ - public class GenerateSourceTests - { - public static TheoryData ClassesWithOverloads - => new() - { - new[] { - "TestData/Source/Count.ValueEnumerable.cs", - }, - new[] { - "TestData/Source/Where.ValueEnumerable.cs", - }, - new[] { - "TestData/Source/Select.ValueEnumerable.cs", - }, - }; - - [Theory] - [MemberData(nameof(ClassesWithOverloads))] - public async Task ClassesWithOverloadsShouldNotGenerate(string[] paths) - { - // Arrange - var generator = new OverloadsGenerator(); - var project = Verifier.CreateProject( - paths - .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories)) - .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories)) - .Select(path => File.ReadAllText(path))); - var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!")); - - // Act - var extensionMethods = generator.CollectExtensionMethods(context); - var result = generator.GenerateSource(extensionMethods, context); - - // Assert - _ = result.Must() - .BeEnumerableOf<(INamedTypeSymbol, INamedTypeSymbol, string)>() - .BeEmpty(); - } - - // ----------------------------------------------------- - - public static TheoryData GeneratorSources - => new() - { - { - new[] { - "TestData/Source/Range.cs", - "TestData/Source/Contains.ValueEnumerable.cs", - }, - new string[] { - } - }, - { - new[] { - "TestData/Source/Select.ArraySegment.cs", - "TestData/Source/Contains.ValueEnumerable.cs", - }, - new string[] { - } - }, - { - new[] { - "TestData/Source/Range.cs", - "TestData/Source/Count.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Range.Count.cs", - } - }, - { - new[] { - "TestData/Source/Repeat.cs", - "TestData/Source/Count.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Repeat.Count.cs", - } - }, - { - new[] { - "TestData/Source/Range.cs", - "TestData/Source/Where.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Range.Where.cs", - } - }, - { - new[] { - "TestData/Source/Range.cs", - "TestData/Source/Select.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Range.Select.cs", - } - }, - { - new[] { - "TestData/Source/Count.ValueEnumerable.cs", - "TestData/Source/Where.ArraySegment.cs", - }, - new[] { - "TestData/Results/Where.ArraySegment.Count.cs", - } - }, - { - new[] { - "TestData/Source/Any.ArraySegment.cs", - "TestData/Source/Any.ValueReadOnlyList.cs", - "TestData/Source/Any.ValueEnumerable.cs", - "TestData/Source/Any.ValueReadOnlyCollection.cs", - "TestData/Source/Where.ValueEnumerable.cs", - }, - new string[] { - } - }, - { - new[] { - "TestData/Source/Any.ArraySegment.cs", - "TestData/Source/Any.ValueReadOnlyList.cs", - "TestData/Source/Any.ValueEnumerable.cs", - "TestData/Source/Any.ValueReadOnlyCollection.cs", - "TestData/Source/Select.ArraySegment.cs", - }, - new[] { - "TestData/Results/Select.ArraySegment.Any.cs", - } - }, - { - new[] { - "TestData/Source/Any.ArraySegment.cs", - "TestData/Source/Any.ValueReadOnlyList.cs", - "TestData/Source/Any.ValueEnumerable.cs", - "TestData/Source/Any.ValueReadOnlyCollection.cs", - "TestData/Source/Select.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Select.ValueEnumerable.Any.cs", - } - }, - { - new[] { - "TestData/Source/Count.ValueEnumerable.cs", - "TestData/Source/Where.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Where.ValueEnumerable.Count.cs", - } - }, - { - new[] { - "TestData/Source/First.ValueEnumerable.cs", - "TestData/Source/Where.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Where.ValueEnumerable.First.cs", - } - }, - { - new[] { - "TestData/Source/First.ValueEnumerable.cs", - "TestData/Source/Select.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Select.ValueEnumerable.First.cs", - } - }, - { - new[] { - "TestData/Source/Where.ValueEnumerable.cs", - "TestData/Source/Distinct.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Where.ValueEnumerable.Distinct.cs", - "TestData/Results/Distinct.ValueEnumerable.Where.cs", - } - }, - { - new[] { - "TestData/Source/Where.ValueEnumerable.cs", - "TestData/Source/Select.ValueEnumerable.cs", - }, - new[] { - "TestData/Results/Where.ValueEnumerable.Select.cs", - "TestData/Results/Select.ValueEnumerable.Where.cs", - } - }, - { - new[] { - "TestData/Source/Where.ValueEnumerable.cs", - "TestData/Source/Dictionary.Bindings.cs", - }, - new[] { - "TestData/Results/Dictionary.Where.cs", - } - }, - { - new[] { - "TestData/Source/Select.ValueEnumerable.cs", - "TestData/Source/Dictionary.Bindings.cs", - }, - new[] { - "TestData/Results/Dictionary.Select.cs", - } - }, - }; - - [Theory] - [MemberData(nameof(GeneratorSources))] - public async Task GenerateSourceShouldGenerate(string[] paths, string[] expected) - { - // Arrange - var generator = new OverloadsGenerator(); - var project = Verifier.CreateProject( - paths - .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories)) - .Concat(Directory.EnumerateFiles("../../../../NetFabric.Hyperlinq.SourceGenerator/Attributes/", "*.cs", SearchOption.AllDirectories)) - .Select(path => File.ReadAllText(path))); - var context = new CompilationContext(await project.GetCompilationAsync().ConfigureAwait(false) ?? throw new System.Exception("Error getting compilation!")); - - // Act - var extensionMethods = generator.CollectExtensionMethods(context); - var result = generator.GenerateSource(extensionMethods, context); - - // Assert - _ = result.Select(item => item.Source) - .ToArray() - .Must() - .BeEqualTo(expected.Select(path => File.ReadAllText(path))); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs deleted file mode 100644 index 00caa8d8c..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Select.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class DictionaryBindings - { - public partial struct ValueWrapper - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, NetFabric.Hyperlinq.FunctionWrapper, TResult>> Select(System.Func, TResult> selector) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult>(this, selector); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, TSelector> Select(TSelector selector = default) - where TSelector : struct, NetFabric.Hyperlinq.IFunction, TResult> - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TResult, TSelector>(this, selector); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs deleted file mode 100644 index 1e44137c6..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Dictionary.Where.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class DictionaryBindings - { - public partial struct ValueWrapper - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, NetFabric.Hyperlinq.FunctionWrapper, bool>> Where(System.Func, bool> predicate) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TPredicate> Where(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction, bool> - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, System.Collections.Generic.Dictionary.Enumerator, System.Collections.Generic.KeyValuePair, TPredicate>(this, predicate); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs deleted file mode 100644 index 85119f091..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Distinct.ValueEnumerable.Where.cs +++ /dev/null @@ -1,36 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct DistinctEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, NetFabric.Hyperlinq.FunctionWrapper> Where(System.Func predicate) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, TPredicate> Where(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource, TPredicate>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource> Distinct() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Distinct, NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable.DisposableEnumerator, TSource>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs deleted file mode 100644 index cad14e728..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Count.cs +++ /dev/null @@ -1,20 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this NetFabric.Hyperlinq.ValueEnumerable.RangeEnumerable source) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count(source); - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs deleted file mode 100644 index 87cf749f7..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Select.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - public partial struct RangeEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable> Select(System.Func selector) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select(this, selector); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable Select(TSelector selector = default) - where TSelector : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select(this, selector); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs deleted file mode 100644 index 14219e17f..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Range.Where.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - public partial struct RangeEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable> Where(System.Func predicate) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable Where(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where(this, predicate); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs deleted file mode 100644 index 41ac35b3f..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Repeat.Count.cs +++ /dev/null @@ -1,20 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable source) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable.DisposableEnumerator, TSource>(source); - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs deleted file mode 100644 index f44a33abe..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ArraySegment.Any.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - public partial struct ArraySegmentSelectEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly bool Any(System.Func predicate) - => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Any, TResult>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly bool Any(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Any, TResult, TPredicate>(this, predicate); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs deleted file mode 100644 index 76ba1132a..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Any.cs +++ /dev/null @@ -1,36 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct SelectEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly bool Any() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly bool Any(System.Func predicate) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly bool Any(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Any, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate>(this, predicate); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs deleted file mode 100644 index 77c913be7..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.First.cs +++ /dev/null @@ -1,23 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct SelectEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.Option First() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.First, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs deleted file mode 100644 index 6c9ed4726..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Select.ValueEnumerable.Where.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct SelectEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, NetFabric.Hyperlinq.FunctionWrapper> Where(System.Func predicate) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult>(this, predicate); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate> Where(TPredicate predicate = default) - where TPredicate : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Where, NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable.DisposableEnumerator, TResult, TPredicate>(this, predicate); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs deleted file mode 100644 index 444845022..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ArraySegment.Count.cs +++ /dev/null @@ -1,23 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - public partial struct ArraySegmentWhereEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly int Count() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentWhereEnumerable.DisposableEnumerator, TSource>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs deleted file mode 100644 index a68c8d6da..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Count.cs +++ /dev/null @@ -1,23 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct WhereEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly int Count() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Count, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs deleted file mode 100644 index 6f5f15c16..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Distinct.cs +++ /dev/null @@ -1,23 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct WhereEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.DistinctEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource> Distinct() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Distinct, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs deleted file mode 100644 index 8b13b25f7..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.First.cs +++ /dev/null @@ -1,23 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct WhereEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.Option First() - => NetFabric.Hyperlinq.ValueEnumerableExtensions.First, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource>(this); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs deleted file mode 100644 index c9b3e7b9b..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Results/Where.ValueEnumerable.Select.cs +++ /dev/null @@ -1,30 +0,0 @@ -#nullable enable - -using System; -using System.CodeDom.Compiler; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public partial struct WhereEnumerable - { - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, NetFabric.Hyperlinq.FunctionWrapper> Select(System.Func selector) - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult>(this, selector); - - [GeneratedCode("NetFabric.Hyperlinq.SourceGenerator", "1.0.0")] - [DebuggerNonUserCode] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly NetFabric.Hyperlinq.ValueEnumerableExtensions.SelectEnumerable, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, TSelector> Select(TSelector selector = default) - where TSelector : struct, NetFabric.Hyperlinq.IFunction - => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select, NetFabric.Hyperlinq.ValueEnumerableExtensions.WhereEnumerable.DisposableEnumerator, TSource, TResult, TSelector>(this, selector); - - } - - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs deleted file mode 100644 index fb6d8bcbb..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ArraySegment.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - - public static bool Any(this in ArraySegment source) - => source.Count != 0; - - public static bool Any(this in ArraySegment source, Func predicate) - => source.Any(new FunctionWrapper(predicate)); - - public static bool Any(this in ArraySegment source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => default; - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs deleted file mode 100644 index 2c79e1b31..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueEnumerable.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - - public static bool Any(this TEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => default; - - public static bool Any(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => source.Any>(new FunctionWrapper(predicate)); - - public static bool Any(this TEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => default; - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs deleted file mode 100644 index 085c79a11..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Any.ValueReadOnlyList.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueReadOnlyListExtensions - { - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TList source) - where TList : struct, IReadOnlyList - => source.Count is not 0; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TList source, Func predicate) - where TList : struct, IReadOnlyList - => source.Any>(new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TList source, TPredicate predicate = default) - where TList : struct, IReadOnlyList - where TPredicate : struct, IFunction - => default; - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs deleted file mode 100644 index 719dbb63a..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunction.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace NetFabric.Hyperlinq -{ - public interface IFunction - { - TResult Invoke(T arg); - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs deleted file mode 100644 index ce38a1db7..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IFunctionWrapper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace NetFabric.Hyperlinq -{ - public readonly struct FunctionWrapper - : IFunction - { - readonly Func function; - - public FunctionWrapper(Func function) - => this.function = function; - - public TResult Invoke(T arg) - => function(arg); - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs deleted file mode 100644 index d4efc695c..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/IValueEnumerable.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public interface IValueEnumerable - : IEnumerable - where TEnumerator - : struct - , IEnumerator - { - new TEnumerator GetEnumerator(); - } - - public interface IValueReadOnlyCollection - : IReadOnlyCollection - , IValueEnumerable - where TEnumerator - : struct - , IEnumerator - { - } - - public interface IValueReadOnlyList - : IReadOnlyList - , IValueReadOnlyCollection - where TEnumerator - : struct - , IEnumerator - { - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs deleted file mode 100644 index 4c68b37b2..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/Option.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public readonly struct Option - { - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs deleted file mode 100644 index 27b56347f..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/PredicateCombination.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace NetFabric.Hyperlinq -{ - public struct PredicateCombination - : IFunction - where TPredicate1 : struct, IFunction - where TPredicate2 : struct, IFunction - { - TPredicate1 first; - TPredicate2 second; - - public PredicateCombination(TPredicate1 first, TPredicate2 second) - => (this.first, this.second) = (first, second); - - public bool Invoke(TSource item) - => first.Invoke(item) && second.Invoke(item); - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs deleted file mode 100644 index f7dfe9134..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Common/SelectorCombination.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace NetFabric.Hyperlinq -{ - public readonly struct SelectorCombination - : IFunction - where TSelector1 : struct, IFunction - where TSelector2 : struct, IFunction - { - readonly TSelector1 first; - readonly TSelector2 second; - - public SelectorCombination(TSelector1 first, TSelector2 second) - => (this.first, this.second) = (first, second); - - public TResult Invoke(TSource item) - => second.Invoke(first.Invoke(item)); - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Contains.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Contains.ValueEnumerable.cs deleted file mode 100644 index 7de29c2c4..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Contains.ValueEnumerable.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public static bool Contains(this TEnumerable source, TSource value) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => default; - - public static bool Contains(this TEnumerable source, TSource value, IEqualityComparer? comparer) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => default; - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Count.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Count.ValueEnumerable.cs deleted file mode 100644 index 897fe92b1..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Count.ValueEnumerable.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public static int Count(this TEnumerable _) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => 0; - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Dictionary.Bindings.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Dictionary.Bindings.cs deleted file mode 100644 index 68137e488..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Dictionary.Bindings.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class DictionaryBindings - { - [GeneratorMapping("TSource", "System.Collections.Generic.KeyValuePair", true)] - public readonly partial struct ValueWrapper - : IValueReadOnlyCollection, Dictionary.Enumerator> - , ICollection> - where TKey : notnull - { - readonly Dictionary source; - - public ValueWrapper(Dictionary source) - => this.source = source; - - public int Count - => source.Count; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary.Enumerator GetEnumerator() - => source.GetEnumerator(); - - IEnumerator> IEnumerable>.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => GetEnumerator(); - - bool ICollection>.IsReadOnly - => true; - - void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) - => ((ICollection>)source).CopyTo(array, arrayIndex); - - void ICollection>.Add(KeyValuePair item) - => throw new NotSupportedException(); - void ICollection>.Clear() - => throw new NotSupportedException(); - bool ICollection>.Contains(KeyValuePair item) - => throw new NotSupportedException(); - bool ICollection>.Remove(KeyValuePair item) - => throw new NotSupportedException(); - } - - public static int Count(this ValueWrapper source) - where TKey : notnull - => source.Count; - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ArraySegment.cs deleted file mode 100644 index a950046e1..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ArraySegment.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - public static ArraySegmentDistinctEnumerable Distinct(this in ArraySegment source) - => new(source); - - public readonly partial struct ArraySegmentDistinctEnumerable - : IValueEnumerable.DisposableEnumerator> - { - readonly ArraySegment source; - - internal ArraySegmentDistinctEnumerable(in ArraySegment source) - => this.source = source; - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TSource Current => default!; - readonly TSource IEnumerator.Current => default!; - readonly object IEnumerator.Current => default!; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ValueEnumerable.cs deleted file mode 100644 index 493f1a6f3..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Distinct.ValueEnumerable.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - public static DistinctEnumerable Distinct(this TEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => new(source); - - public readonly partial struct DistinctEnumerable - : IValueEnumerable.DisposableEnumerator> - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - { - readonly TEnumerable source; - - internal DistinctEnumerable(TEnumerable source) - => this.source = source; - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TSource Current => default!; - readonly TSource IEnumerator.Current => default!; - readonly object? IEnumerator.Current => default; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ExtensionMethods.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ExtensionMethods.cs deleted file mode 100644 index 629a8d4f2..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ExtensionMethods.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static class ExtensionMethods - { - public static void NotConstrainedExtensionMethod(this ArraySegment _) { } - - static void NotIgnoredExtensionMethod(this TEnumerable _) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - { } - - public static void PublicExtensionMethod(this TEnumerable _) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - { } - } - -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/First.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/First.ValueEnumerable.cs deleted file mode 100644 index 967f11668..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/First.ValueEnumerable.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - - public static Option First(this TEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => default; - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/NoExtensionMethods.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/NoExtensionMethods.cs deleted file mode 100644 index 9b7e6861a..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/NoExtensionMethods.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - //public class NotStaticClass - //{ - // public void Method(TEnumerable _) - // where TEnumerable : IValueEnumerable - // where TEnumerator : struct, IEnumerator - // { } - //} - - //static class NotPublicStaticClass - //{ - // public static void ExtensionMethod(this TEnumerable _) - // where TEnumerable : IValueEnumerable - // where TEnumerator : struct, IEnumerator - // { } - //} - - public static class NoExtensionMethods - { - //public static void NotExtensionMethod(TEnumerable _) - // where TEnumerable : IValueEnumerable - // where TEnumerator : struct, IEnumerator - //{ } - - //static void NotPublicExtensionMethod(this TEnumerable _) - // where TEnumerable : IValueEnumerable - // where TEnumerator : struct, IEnumerator - //{ } - - [GeneratorIgnore] - public static void IgnoredExtensionMethod(this TEnumerable _) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - { } - } - -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Range.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Range.cs deleted file mode 100644 index c2659d429..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Range.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - public static RangeEnumerable Range(int start, int count) - => new(start, count); - - [GeneratorMapping("TSource", "int", true)] - public readonly partial struct RangeEnumerable - : IValueReadOnlyCollection - , ICollection - { - readonly int start; - readonly int end; - - internal RangeEnumerable(int start, int count) - { - this.start = start; - Count = count; - end = checked(start + count); - } - - public int Count { get; } - - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - bool ICollection.IsReadOnly - => true; - - public void CopyTo(int[] array, int arrayIndex) - { - } - - public bool Contains(int value) - => value >= start && value < end; - - void ICollection.Add(int item) - => throw new NotSupportedException(); - void ICollection.Clear() - => throw new NotSupportedException(); - bool ICollection.Remove(int item) - => throw new NotSupportedException(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly int Current => 0; - readonly int IEnumerator.Current => 0; - readonly object IEnumerator.Current => 0; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - - public bool Contains(int value, IEqualityComparer? comparer) - => default; - - public RangeEnumerable Skip(int count) - => default; - } - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Repeat.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Repeat.cs deleted file mode 100644 index 4a343102c..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Repeat.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerable - { - - public static RepeatEnumerable Repeat(TSource value, int count) - { - if (count < 0) throw new ArgumentOutOfRangeException(nameof(count)); - - return new RepeatEnumerable(value, count); - } - - [StructLayout(LayoutKind.Auto)] - public readonly partial struct RepeatEnumerable - : IValueReadOnlyCollection.DisposableEnumerator> - , ICollection - { - readonly TSource value; - readonly int count; - - internal RepeatEnumerable(TSource value, int count) - { - this.value = value; - this.count = count; - } - - public int Count - => count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Enumerator GetEnumerator() - => new(in this); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(in this); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(in this); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(in this); - - bool ICollection.IsReadOnly - => true; - - public void CopyTo(Span span) - { - - } - - public void CopyTo(TSource[] array, int arrayIndex) - { - - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Contains(TSource item) - => count is not 0 && EqualityComparer.Default.Equals(value, item); - - public int IndexOf(TSource item) - => count is not 0 && EqualityComparer.Default.Equals(value, item) - ? 0 - : -1; - - [ExcludeFromCodeCoverage] - void ICollection.Add(TSource item) - => throw new NotSupportedException(); - [ExcludeFromCodeCoverage] - void ICollection.Clear() - => throw new NotSupportedException(); - [ExcludeFromCodeCoverage] - bool ICollection.Remove(TSource item) - => throw new NotSupportedException(); - - [StructLayout(LayoutKind.Sequential)] - public struct Enumerator - { - int counter; - readonly int end; - - internal Enumerator(in RepeatEnumerable enumerable) - { - Current = enumerable.value; - counter = -1; - end = counter + enumerable.Count; - } - - public TSource Current { get; } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool MoveNext() - => ++counter <= end; - } - - [StructLayout(LayoutKind.Sequential)] - public struct DisposableEnumerator - : IEnumerator - { - int counter; - readonly int end; - - internal DisposableEnumerator(in RepeatEnumerable enumerable) - { - Current = enumerable.value; - counter = -1; - end = counter + enumerable.Count; - } - - public TSource Current { get; } - readonly TSource IEnumerator.Current - => Current; - readonly object? IEnumerator.Current - // ReSharper disable once HeapView.PossibleBoxingAllocation - => Current; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool MoveNext() - => ++counter <= end; - - [ExcludeFromCodeCoverage] - public readonly void Reset() - => throw new NotSupportedException(); - - public readonly void Dispose() { } - } - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ArraySegment.cs deleted file mode 100644 index b943fa420..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ArraySegment.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - static ArraySegmentSelectEnumerable> Select(this in ArraySegment source, Func selector) - => Select>(source, new FunctionWrapper(selector)); - - static ArraySegmentSelectEnumerable Select(this in ArraySegment source, TSelector selector = default) - where TSelector : struct, IFunction - => new(source, selector); - - [GeneratorMapping("TSource", "TResult")] - public readonly partial struct ArraySegmentSelectEnumerable - : IValueReadOnlyList.DisposableEnumerator> - , IList - where TSelector : struct, IFunction - { - readonly ArraySegment source; - readonly TSelector selector; - - internal ArraySegmentSelectEnumerable(in ArraySegment source, TSelector selector) - => (this.source, this.selector) = (source, selector); - - public int Count - => 0; - - bool ICollection.IsReadOnly - => true; - - void ICollection.CopyTo(TResult[] array, int arrayIndex) - { } - void ICollection.Add(TResult item) - => throw new NotSupportedException(); - void ICollection.Clear() - => throw new NotSupportedException(); - public bool Contains(TResult item) - => default; - bool ICollection.Remove(TResult item) - => throw new NotSupportedException(); - int IList.IndexOf(TResult item) - => default; - void IList.Insert(int index, TResult item) - => throw new NotSupportedException(); - void IList.RemoveAt(int index) - => throw new NotSupportedException(); - - public TResult this[int index] - => default!; - TResult IReadOnlyList.this[int index] - => this[index]; - TResult IList.this[int index] - { - get => this[index]!; - set => throw new NotSupportedException(); - } - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TResult Current => default!; - readonly object IEnumerator.Current => default!; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - - public bool Any() - => source.Count is not 0; - - public bool Contains(TResult value, IEqualityComparer? comparer = default) - => default; - - public ArraySegmentSelectEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select, TResult2>(new FunctionWrapper(selector)); - - public ArraySegmentSelectEnumerable> Select(TSelector2 selector = default) - where TSelector2 : struct, IFunction - => Select>(source, new SelectorCombination(this.selector, selector)); - } - - public static int Count(this ArraySegmentSelectEnumerable source) - where TSelector : struct, IFunction - => 0; - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ValueEnumerable.cs deleted file mode 100644 index 022d483f3..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Select.ValueEnumerable.cs +++ /dev/null @@ -1,79 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - [GeneratorMapping("TSelector", "NetFabric.Hyperlinq.FunctionWrapper")] - public static SelectEnumerable> Select(this TEnumerable source, Func selector) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => Select>(source, new FunctionWrapper(selector)); - - public static SelectEnumerable Select(this TEnumerable source, TSelector selector = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => new(source, selector); - - [GeneratorMapping("TSource", "TResult")] - public readonly partial struct SelectEnumerable - : IValueEnumerable.DisposableEnumerator> - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - { - readonly TEnumerable source; - readonly TSelector selector; - - internal SelectEnumerable(TEnumerable source, TSelector selector) - => (this.source, this.selector) = (source, selector); - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TResult Current => default!; - readonly object IEnumerator.Current => default!; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - - public int Count() - => source.Count(); - - public SelectEnumerable, TSource, TResult, TResult2>> Select(Func selector) - => Select, TResult2>(new FunctionWrapper(selector)); - - public SelectEnumerable> Select(TSelector2 selector = default) - where TSelector2 : struct, IFunction - => Select>(source, new SelectorCombination(this.selector, selector)); - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ToDictionary.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ToDictionary.ArraySegment.cs deleted file mode 100644 index da24d7b1b..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/ToDictionary.ArraySegment.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Dictionary ToDictionary(this in ArraySegment source, Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - { - if (keySelector is null) throw new ArgumentNullException(nameof(keySelector)); - - return ToDictionary>(source, new FunctionWrapper(keySelector), comparer); - } - - public static Dictionary ToDictionary(this in ArraySegment source, TKeySelector keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - where TKeySelector : struct, IFunction - { - var dictionary = new Dictionary(source.Count, comparer); - return dictionary; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Dictionary ToDictionary(this in ArraySegment source, Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - { - if (keySelector is null) throw new ArgumentNullException(nameof(keySelector)); - if (elementSelector is null) throw new ArgumentNullException(nameof(elementSelector)); - - return ToDictionary, FunctionWrapper>(source, new FunctionWrapper(keySelector), new FunctionWrapper(elementSelector), comparer); - } - - public static Dictionary ToDictionary(this in ArraySegment source, TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - where TKeySelector : struct, IFunction - where TElementSelector : struct, IFunction - { - var dictionary = new Dictionary(source.Count, comparer); - return dictionary; - } - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ArraySegment.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ArraySegment.cs deleted file mode 100644 index 9b5686549..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ArraySegment.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - static ArraySegmentWhereEnumerable> Where(this in ArraySegment source, Func predicate) - => Where(source, new FunctionWrapper(predicate)); - - static ArraySegmentWhereEnumerable Where(this in ArraySegment source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => new(source, predicate); - - public readonly partial struct ArraySegmentWhereEnumerable - : IValueEnumerable.DisposableEnumerator> - where TPredicate : struct, IFunction - { - readonly ArraySegment source; - readonly TPredicate predicate; - - internal ArraySegmentWhereEnumerable(in ArraySegment source, TPredicate predicate) - => (this.source, this.predicate) = (source, predicate); - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TSource Current => default!; - readonly TSource IEnumerator.Current => default!; - readonly object? IEnumerator.Current => default; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - - public bool Any() - => source.Any(predicate); - - public static bool Any(Func predicate) - => default; - - public static bool Any(TPredicate2 predicate = default) - where TPredicate2 : struct, IFunction - => default; - - public ArraySegmentWhereEnumerable, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - - public ArraySegmentWhereEnumerable> Where(TPredicate2 predicate = default) - where TPredicate2 : struct, IFunction - => Where>(source, new PredicateCombination(this.predicate, predicate)); - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ValueEnumerable.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ValueEnumerable.cs deleted file mode 100644 index 6d5a8dcc0..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/TestData/Source/Where.ValueEnumerable.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - [GeneratorMapping("TPredicate", "NetFabric.Hyperlinq.FunctionWrapper")] - public static WhereEnumerable> Where(this TEnumerable source, Func predicate) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => Where>(source, new FunctionWrapper(predicate)); - - public static WhereEnumerable Where(this TEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => new(source, predicate); - - public readonly partial struct WhereEnumerable - : IValueEnumerable.DisposableEnumerator> - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - { - readonly TEnumerable source; - readonly TPredicate predicate; - - internal WhereEnumerable(TEnumerable source, TPredicate predicate) - => (this.source, this.predicate) = (source, predicate); - - public Enumerator GetEnumerator() - => new(); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(); - - public struct Enumerator - { - } - - public struct DisposableEnumerator - : IEnumerator - { - public readonly TSource Current => default!; - readonly TSource IEnumerator.Current => default!; - readonly object? IEnumerator.Current => default; - - public bool MoveNext() - => false; - - public readonly void Reset() - => throw new NotSupportedException(); - - public void Dispose() { } - } - - public bool Any() - => source.Any(predicate); - - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - - public bool Any(TPredicate2 predicate = default) - where TPredicate2 : struct, IFunction - => source.Any>(new PredicateCombination(this.predicate, predicate)); - - public WhereEnumerable, TSource>> Where(Func predicate) - => Where(new FunctionWrapper(predicate)); - - public WhereEnumerable> Where(TPredicate2 predicate = default) - where TPredicate2 : struct, IFunction - => Where>(source, new PredicateCombination(this.predicate, predicate)); - } - } -} - diff --git a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/Verifier.cs b/NetFabric.Hyperlinq.SourceGenerator.UnitTests/Verifier.cs deleted file mode 100644 index a22381d28..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator.UnitTests/Verifier.cs +++ /dev/null @@ -1,42 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Text; -using System.Collections.Generic; -using System.Linq; - -namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests -{ - sealed class Verifier - { - static readonly MetadataReference corlibReference = MetadataReference.CreateFromFile(typeof(object).Assembly.Location); - static readonly MetadataReference systemCoreReference = MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location); - static readonly MetadataReference cSharpSymbolsReference = MetadataReference.CreateFromFile(typeof(CSharpCompilation).Assembly.Location); - static readonly MetadataReference codeAnalysisReference = MetadataReference.CreateFromFile(typeof(Compilation).Assembly.Location); - - static readonly string defaultFilePathPrefix = "Test"; - static readonly string testProjectName = "TestProject"; - - public static Project CreateProject(IEnumerable sources) - { - var projectId = ProjectId.CreateNewId(debugName: testProjectName); - - var solution = new AdhocWorkspace() - .CurrentSolution - .AddProject(projectId, testProjectName, testProjectName, LanguageNames.CSharp) - .AddMetadataReference(projectId, corlibReference) - .AddMetadataReference(projectId, systemCoreReference) - .AddMetadataReference(projectId, cSharpSymbolsReference) - .AddMetadataReference(projectId, codeAnalysisReference); - - var count = 0; - foreach (var source in sources) - { - var newFileName = defaultFilePathPrefix + count + ".cs"; - var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName); - solution = solution.AddDocument(documentId, newFileName, SourceText.From(source)); - count++; - } - return solution.GetProject(projectId)!; - } - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator/NetFabric.Hyperlinq.SourceGenerator.csproj b/NetFabric.Hyperlinq.SourceGenerator/NetFabric.Hyperlinq.SourceGenerator.csproj deleted file mode 100644 index 538195793..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator/NetFabric.Hyperlinq.SourceGenerator.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - netstandard2.0 - true - - - - https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json ;$(RestoreAdditionalProjectSources) - - - - - - - all - runtime; build; native; contentfiles; analyzers - - - - diff --git a/NetFabric.Hyperlinq.SourceGenerator/OverloadsGenerator.cs b/NetFabric.Hyperlinq.SourceGenerator/OverloadsGenerator.cs deleted file mode 100644 index 1852dbec3..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator/OverloadsGenerator.cs +++ /dev/null @@ -1,409 +0,0 @@ -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Text; -using System; -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Diagnostics; -using System.Linq; -using System.Text; - -namespace NetFabric.Hyperlinq.SourceGenerator -{ - [Generator] - public class OverloadsGenerator - : ISourceGenerator - { - static readonly DiagnosticDescriptor unhandledExceptionError = new( - id: "HPLG001", - title: "Unhandled exception while generating overloads", - messageFormat: "Unhandled exception while generating overloads: {0}", - category: "OverloadsGenerator", - DiagnosticSeverity.Error, - isEnabledByDefault: true); - - - public void Initialize(GeneratorInitializationContext context) - { - } - - public void Execute(GeneratorExecutionContext context) - { - //_ = Debugger.Launch(); // uncomment to debug this source generator - - var compilationContext = new CompilationContext(context.Compilation); - - try - { - var collectedExtensionMethods = CollectExtensionMethods(compilationContext); - - var generatedSources = GenerateSource(collectedExtensionMethods, compilationContext); - foreach (var (containerClass, extendingType, generatedSource) in generatedSources) - { - var hitName = $"{containerClass.OriginalDefinition.MetadataName}.{extendingType.OriginalDefinition.MetadataName}.g.cs"; - hitName = hitName.Replace('`', '.'); - context.AddSource(hitName, SourceText.From(generatedSource, Encoding.UTF8)); - } - - } - catch (Exception ex) - { - context.ReportDiagnostic(Diagnostic.Create(unhandledExceptionError, Location.None, ex.Message)); - } - } - - /// - /// Collects all the extension methods defined - /// - /// - /// A dictionary containing collections of the extension methods per type extended. - internal DictionarySet CollectExtensionMethods(CompilationContext context) - { - var collectedExtensionMethods = new DictionarySet(); - - // go through all implemented static types and get all the extension methods implemented - var extensionMethods = context.Compilation.SourceModule.GlobalNamespace - .GetAllTypes() - .Where(typeSymbol => - typeSymbol.IsStatic - && typeSymbol.IsPublic() - ) - .SelectMany(typeSymbol => - typeSymbol.GetMembers() - .OfType() - .Where(methodSymbol => - methodSymbol.IsExtensionMethod - //&& methodSymbol.IsPublic() - && !methodSymbol.ShouldIgnore(context) - ) - ); - - // go through all extension methods - foreach (var extensionMethod in extensionMethods) - { - var extensionType = extensionMethod.Parameters[0].Type; - var generic = extensionMethod.TypeParameters - .FirstOrDefault(typeParameter - => typeParameter.ConstraintTypes.Length > 0 - && typeParameter.Name == extensionType.Name); - if (generic is null) - { - var name = extensionMethod.Parameters[0].Type.OriginalDefinition.MetadataName; - switch (name) - { - case "ArraySegment`1": - case "ReadOnlySpan`1": - case "ReadOnlyMemory`1": - collectedExtensionMethods.Add(name, extensionMethod.GetInfo(context, 1)); - break; - } - } - else - { - // the extended type is a constrained generic parameter - var extendingType = generic.ConstraintTypes[0]; - var name = extendingType.OriginalDefinition.MetadataName; - switch (name) - { - case "IValueEnumerable`2": - case "IValueReadOnlyCollection`2": - case "IValueReadOnlyList`2": - case "IReadOnlyList`1": - case "IAsyncValueEnumerable`2": - collectedExtensionMethods.Add(name, extensionMethod.GetInfo(context, 1)); - break; - } - } - } - - return collectedExtensionMethods; - } - - /// - /// Generates the source for the overloads based on the defined extension methods. - /// - /// - /// A dictionary containing the defined extension methods. - /// The path where to serialize the generated code for debugging. - internal IEnumerable<(INamedTypeSymbol ContainerClass, INamedTypeSymbol ExtendedType, string Source)> GenerateSource(DictionarySet collectedExtensionMethods, CompilationContext context) - { - // go through all candidate types to be extended - // these are inner types of a public static class that are not static and not interfaces - foreach (var extendingType in context.Compilation.SourceModule.GlobalNamespace - .GetAllTypes() - .Where(type => type.IsStatic && type.IsReferenceType && type.IsPublic() && !type.ShouldIgnore(context)) - .SelectMany(containerType => containerType.GetTypeMembers().OfType() - .Where(type => !(type.IsStatic || type.IsInterface() || type.ShouldIgnore(context))))) - { - var bindingAttribute = extendingType.GetBindingsAttribute(context); - foreach (var source in GenerateSource(collectedExtensionMethods, context, extendingType, bindingAttribute)) - yield return source; - } - } - - IEnumerable<(INamedTypeSymbol ContainerClass, INamedTypeSymbol ExtendedType, string Source)> GenerateSource(DictionarySet collectedExtensionMethods, CompilationContext context, INamedTypeSymbol extendingType, GeneratorBindingsAttribute? bindingsAttribute) - { - // check if it's a value enumerable and keep a reference to the implemented interface - var valueEnumerableInterface = extendingType.GetAllInterfaces() - .FirstOrDefault(@interface => @interface.Name is "IValueEnumerable" or "IAsyncValueEnumerable"); - if (valueEnumerableInterface is not null || bindingsAttribute is not null) - { - // get the types of the enumerable, enumerator and source from the generic parameters declaration - var enumerableType = extendingType; - var enumeratorType = valueEnumerableInterface?.TypeArguments[1]; - var sourceType = valueEnumerableInterface?.TypeArguments[0]; - - // get the type mappings from the GeneratorMappingsAttribute, if found. - var typeGenericsMapping = extendingType.GetGenericsMappings(context); - - // get the info of all the instance methods declared in the type to be extended - var implementedInstanceMethods = extendingType.GetMembers().OfType() - .Where(method => method.Name is not ".ctor") // ignore the constructors - .Select(method => method.GetInfo(context)) - .ToArray(); - - // get the extension methods for this type declared in the outter static type - var implementedExtensionMethods = extendingType.ContainingType.GetMembers().OfType() - .Where(method - => method.IsExtensionMethod - && method.Parameters[0].Type.ToDisplayString() == extendingType.ToDisplayString()) - .Select(method => method.GetInfo(context, 1)) - .ToArray(); - - // join the two lists together as these are the implemented methods for this type - var implementedMethods = implementedInstanceMethods.Concat(implementedExtensionMethods) - .ToList(); - - // lists of methods to be generated - var instanceMethodsToBeGenerated = new List(); - var extensionMethodsToBeGenerated = new List(); - - // go through all the implemented interfaces so that - // the overloads are generated based on the extension methods defined for these - var implementedTypes = - bindingsAttribute?.SourceImplements?.Split(',') - ?? extendingType.AllInterfaces.Select(type => type.OriginalDefinition.MetadataName); - - foreach (var implementedType in implementedTypes) - { - // get the extension methods collected for this interface - if (!collectedExtensionMethods.TryGetValue(implementedType, out var overloadingMethods)) - continue; - - // check which ones should be generated - // the method can be already defined by a more performant custom implementation - for (var methodIndex = 0; methodIndex < overloadingMethods.Count; methodIndex++) - { - var overloadingMethod = overloadingMethods[methodIndex]; - - // check if already implemented - var mappedOverloadingMethods = overloadingMethod.ApplyMappings(typeGenericsMapping); - if (!implementedMethods.Any(method => method.IsOverload(mappedOverloadingMethods)) - && !((mappedOverloadingMethods.Name is "Select" || mappedOverloadingMethods.Name is "SelectAt") && (extendingType.Name.EndsWith("SelectEnumerable") || extendingType.Name.EndsWith("SelectAtEnumerable")))) // these cases are hard to fix other way - { - // check if there's a collision with a property - if (extendingType.GetMembers().OfType() - .Any(property => property.Name == mappedOverloadingMethods.Name)) - { - // this method will be generated as an extension method - extensionMethodsToBeGenerated.Add(mappedOverloadingMethods); - } - else - { - // this method will generated as an instance method - instanceMethodsToBeGenerated.Add(mappedOverloadingMethods); - } - - implementedMethods.Add(mappedOverloadingMethods); - } - } - } - - // generate the code for the instance methods and extension methods, if any... - if (instanceMethodsToBeGenerated.Count is not 0 || extensionMethodsToBeGenerated.Count is not 0) - { - var builder = new CodeBuilder(); - _ = builder - .AppendLine("#nullable enable") - .AppendLine() - .AppendLine("using System;") - .AppendLine("using System.CodeDom.Compiler;") - .AppendLine("using System.Diagnostics;") - .AppendLine("using System.Runtime.CompilerServices;") - .AppendLine(); - - using (builder.AppendBlock($"namespace NetFabric.Hyperlinq")) - { - // the generator extends the types by adding partial types - // both the outter and the inner types have to be declared as partial - using (builder.AppendBlock($"public static partial class {extendingType.ContainingType.Name}")) - { - // generate the instance methods in the inner type - if (instanceMethodsToBeGenerated.Count is not 0) - { - var extendingTypeGenericParameters = string.Empty; - if (extendingType.IsGenericType) - { - var parametersDefinition = new StringBuilder(); - _ = parametersDefinition.Append($"<{extendingType.TypeParameters.Select(parameter => parameter.ToDisplayString()).ToCommaSeparated()}>"); - // foreach (var typeParameter in extendingType.TypeParameters.Where(typeParameter => typeParameter.ConstraintTypes.Length is not 0)) - // _ = parametersDefinition.Append($" where {typeParameter.Name} : {typeParameter.AsConstraintsStrings().ToCommaSeparated()}"); - extendingTypeGenericParameters = parametersDefinition.ToString(); - } - - var entity = extendingType.IsValueType - ? "struct" - : "class"; - using (builder.AppendBlock($"public partial {entity} {extendingType.Name}{extendingTypeGenericParameters}")) - { - foreach (var instanceMethod in instanceMethodsToBeGenerated) - { - var methodGenericsMapping = typeGenericsMapping.AddRange(instanceMethod.GenericsMapping); - GenerateMethodSource(builder, context, extendingType, instanceMethod, enumerableType, enumeratorType, sourceType, methodGenericsMapping, false, bindingsAttribute); - } - } - } - _ = builder.AppendLine(); - - // generate the extension methods in the outter type - foreach (var extensionMethod in extensionMethodsToBeGenerated) - { - var methodGenericsMapping = typeGenericsMapping.AddRange(extensionMethod.GenericsMapping); - GenerateMethodSource(builder, context, extendingType, extensionMethod, enumerableType, enumeratorType, sourceType, methodGenericsMapping, true, bindingsAttribute); - } - } - } - - var source = builder.ToString().Replace("TResult, TResult", "TSource, TResult"); - yield return (extendingType.ContainingType, extendingType, source); - } - } - } - - void GenerateMethodSource(CodeBuilder builder, CompilationContext context, INamedTypeSymbol extendingType, MethodInfo methodToGenerate, ITypeSymbol? enumerableType, ITypeSymbol? enumeratorType, ITypeSymbol sourceType, ImmutableArray genericsMapping, bool isExtensionMethod, GeneratorBindingsAttribute? bindingsAttribute) - { - var extendingTypeTypeArguments = extendingType.MappedTypeArguments(genericsMapping) - .ToArray(); - var typeParameters = isExtensionMethod - ? methodToGenerate.TypeParameters - .Where(typeParameter => - !typeParameter.IsConcreteType - && typeParameter.Name is not "TEnumerable" and not "TEnumerator" and not "TList") - .ToArray() - : methodToGenerate.TypeParameters - .Where(typeParameter => - !typeParameter.IsConcreteType - && typeParameter.Name is not "TEnumerable" and not "TEnumerator" and not "TList" - && !extendingTypeTypeArguments.Any(argument => argument.Name == typeParameter.Name)) - .ToArray(); - - var methodReturnType = methodToGenerate.ReturnType.ToDisplayString(); - var genericsIndex = methodReturnType.IndexOf('<'); - if (genericsIndex >= 0) - { - methodReturnType = methodReturnType.Substring(0, genericsIndex); - if (methodToGenerate.ReturnType is INamedTypeSymbol namedMethodReturnType) - { - if (bindingsAttribute is null) - methodReturnType += MapTypeProperties(namedMethodReturnType.TypeArguments.Select(argument => argument.ToDisplayString()), enumerableType!, enumeratorType!, sourceType, genericsMapping); - else - methodReturnType += MapTypeProperties(namedMethodReturnType.TypeArguments.Select(argument => argument.ToDisplayString()), bindingsAttribute); - } - } - if (methodReturnType is "TEnumerable") - methodReturnType = extendingType.ToDisplayString(); - - var methodName = methodToGenerate.Name; - var methodExtensionType = extendingType.ToDisplayString(); - var methodParameters = methodToGenerate.Parameters - .Select(parameter => parameter.DefaultValue is null - ? $"{parameter.Type} {parameter.Name}" - : $"{parameter.Type} {parameter.Name} = {parameter.DefaultValue}") - .ToCommaSeparated(); - var methodGenericParameters = typeParameters - .Select(typeParameter => typeParameter.Name) - .ToCommaSeparated(); - var methodGenericParametersString = methodGenericParameters.Any() - ? $"<{methodGenericParameters}>" - : string.Empty; - - var returnKeyword = string.Empty; - var callContainingType = methodToGenerate.ContainingType; - var callTypeParameters = bindingsAttribute is null - ? MapTypeProperties(methodToGenerate.TypeParameters.Select(parameter => parameter.Name), enumerableType!, enumeratorType!, sourceType, genericsMapping) - : MapTypeProperties(methodToGenerate.TypeParameters.Select(parameter => parameter.Name), bindingsAttribute); - var callParameters = methodToGenerate.Parameters.Select(parameter => parameter.Name).ToCommaSeparated(); - - // generate the source - _ = builder - .AppendLine(context.GeneratedCodeAttribute) - .AppendLine("[DebuggerNonUserCode]") - .AppendLine("[MethodImpl(MethodImplOptions.AggressiveInlining)]"); - - var firstCallParameter = bindingsAttribute?.Source ?? "this"; - - if (isExtensionMethod) - { - 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" - : $"source.{bindingsAttribute.Source}"; - } - else - { - var methodReadonly = extendingType.IsValueType ? "readonly" : string.Empty; - _ = builder.AppendLine($"public {methodReadonly} {methodReturnType} {methodName}{methodGenericParametersString}({methodParameters})"); - } - foreach (var (name, constraints, _) in typeParameters.Where(typeParameter => typeParameter.Constraints.Any())) - _ = builder.AppendLine($"where {name} : {constraints}"); - - callParameters = StringExtensions.CommaSeparateIfNotNullOrEmpty(firstCallParameter, callParameters, bindingsAttribute?.ExtraParameters); - - _ = builder - .AppendLine($"=> {callContainingType}.{methodName}{callTypeParameters}({callParameters});") - .AppendLine(); - } - - string MapTypeProperties(IEnumerable typePropertyNames, ITypeSymbol enumerableType, ITypeSymbol enumeratorType, ITypeSymbol sourceType, ImmutableArray genericsMapping) - { - var str = typePropertyNames.Select(typePropertyName => typePropertyName switch - { - "TEnumerable" or "TList" => enumerableType.ToDisplayString(genericsMapping), - "TEnumerator" => enumeratorType.ToDisplayString(genericsMapping), - "TSource" => sourceType.ToDisplayString(genericsMapping), - _ => typePropertyName.ApplyMappings(genericsMapping, out _), - }) - .ToCommaSeparated(); - - return str switch - { - { Length: 0 } => string.Empty, - _ => $"<{str}>" - }; - } - - string MapTypeProperties(IEnumerable typePropertyNames, GeneratorBindingsAttribute? bindingsAttribute) - { - var str = typePropertyNames.Select(typePropertyName => typePropertyName switch - { - "TEnumerable" or "TList" => bindingsAttribute?.EnumerableType ?? typePropertyName, - "TEnumerator" => bindingsAttribute?.EnumeratorType ?? typePropertyName, - "TSource" => bindingsAttribute?.ElementType ?? typePropertyName, - _ => typePropertyName, - }) - .ToCommaSeparated(); - - str = StringExtensions.CommaSeparateIfNotNullOrEmpty(str, bindingsAttribute?.ExtraTypeParameters); - - return str switch - { - { Length: 0 } => string.Empty, - _ => $"<{str}>" - }; - } - } -} diff --git a/NetFabric.Hyperlinq.SourceGenerator/Properties/AssemblyInfo.cs b/NetFabric.Hyperlinq.SourceGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index 423b8e090..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,3 +0,0 @@ -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("NetFabric.Hyperlinq.SourceGenerator.UnitTests")] \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/CodeBuilder.cs b/NetFabric.Hyperlinq.SourceGenerator/Utils/CodeBuilder.cs deleted file mode 100644 index 1c57c05b2..000000000 --- a/NetFabric.Hyperlinq.SourceGenerator/Utils/CodeBuilder.cs +++ /dev/null @@ -1,71 +0,0 @@ -using System; -using System.Text; - -namespace NetFabric.Hyperlinq.SourceGenerator -{ - class CodeBuilder - { - static readonly string tab = " "; - - readonly StringBuilder builder = new(); - int currentLevel = 0; - - StringBuilder AppendIndentation() - { - for (var level = 0; level < currentLevel; level++) - _ = builder.Append(tab); - - return builder; - } - - public CodeBuilder AppendLine() - { - _ = builder.AppendLine(); - return this; - } - - public CodeBuilder AppendLine(char line) - { - _ = AppendIndentation().Append(line).AppendLine(); - return this; - } - - public CodeBuilder AppendLine(string line) - { - _ = AppendIndentation().AppendLine(line); - return this; - } - - public CodeBuilder AppendLine(Action line) - { - _ = AppendIndentation(); - line(builder); - _ = AppendLine(); - return this; - } - - public IDisposable AppendBlock(string line) - { - _ = AppendLine(line).AppendLine('{'); - currentLevel++; - return new CloseBlock(this); - } - - class CloseBlock : IDisposable - { - readonly CodeBuilder builder; - - public CloseBlock(CodeBuilder builder) - => this.builder = builder; - - public void Dispose() - { - builder.currentLevel--; - _ = builder.AppendLine('}'); - } - } - - public override string ToString() - => builder.ToString(); - } -} diff --git a/NetFabric.Hyperlinq.UnitTests/GenerateSourceTests.cs b/NetFabric.Hyperlinq.UnitTests/GenerateSourceTests.cs new file mode 100644 index 000000000..5d0ee0543 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/GenerateSourceTests.cs @@ -0,0 +1,148 @@ +using Microsoft.CodeAnalysis.CSharp.Syntax; +using NetFabric.Assertive; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests +{ + public class GenerateSourceTests + { + public static TheoryData GeneratorSources + => new() + { + { + new[] { "TestData/Source/AsValueEnumerable.Empty.cs" }, + "TestData/Results/Empty.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.Empty2.cs" }, + "TestData/Results/Empty.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.Empty3.cs" }, + "TestData/Results/Empty.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.Repeat.cs" }, + "TestData/Results/AsValueEnumerable.Repeat.cs" + }, + + { + new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs" }, + "TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs" }, + "TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs" }, + "TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs" }, + "TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs" }, + "TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestCollection.cs" }, + "TestData/Results/AsValueEnumerable.TestCollection.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestReadOnlyCollection.cs" }, + "TestData/Results/AsValueEnumerable.TestReadOnlyCollection.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestList.cs" }, + "TestData/Results/AsValueEnumerable.TestList.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.IReadOnlyList.cs" }, + "TestData/Results/AsValueEnumerable.IReadOnlyList.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestListWithExplicitInterfaces.cs" }, + "TestData/Results/AsValueEnumerable.TestListWithExplicitInterfaces.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestReadOnlyList.cs" }, + "TestData/Results/AsValueEnumerable.TestReadOnlyList.cs" + }, + { + new[] { "TestData/Source/AsValueEnumerable.TestValueEnumerable.cs" }, + "TestData/Results/AsValueEnumerable.TestValueEnumerable.cs" + }, + { + new[] { "TestData/Source/Count.Array.cs" }, + "TestData/Results/Count.Array.cs" + }, + { + new[] { "TestData/Source/Select.Array.cs" }, + "TestData/Results/Select.Array.cs" + }, + { + new[] { "TestData/Source/Where.Array.cs" }, + "TestData/Results/Where.Array.cs" + }, + { + new[] { "TestData/Source/Skip.Take.Array.cs" }, + "TestData/Results/Skip.Take.Array.cs" + }, + //{ + // new[] { "TestData/Source/Count.Span.cs" }, + // "TestData/Results/Count.Span.cs" + //}, + { + new[] { "TestData/Source/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs" }, + "TestData/Results/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs" + }, + { + new[] { "TestData/Source/Select.TestEnumerableWithValueTypeEnumerator.cs" }, + "TestData/Results/Select.TestEnumerableWithValueTypeEnumerator.cs" + }, + }; + + [Theory] + [MemberData(nameof(GeneratorSources))] + public async Task GenerateSourceShouldGenerate(string[] paths, string expected) + { + // Arrange + var sources = paths + .Concat(Directory.EnumerateFiles("TestData/Source/Common", "*.cs", SearchOption.AllDirectories)) + .Select(path => File.ReadAllText(path)); + var project = Verifier.CreateProject(sources); + var compilation = await project.GetCompilationAsync().ConfigureAwait(false) + ?? throw new System.Exception("Error getting compilation!"); + //var errors = compilation + // .GetDiagnostics() + // .Where(diagnostic => diagnostic.Severity == DiagnosticSeverity.Error) + // .ToArray(); + //_ = errors.Must().BeEqualTo(Array.Empty()); + var typeSymbolsCache = new TypeSymbolsCache(compilation); + var memberAccessExpressions = compilation.SyntaxTrees + .SelectMany(tree => tree.GetRoot().DescendantNodes().OfType()) + .Where(memberAccess => Generator.methods.Contains(memberAccess.Name.Identifier.ValueText)) + .ToList(); + + // Act + var builder = new CodeBuilder { IsUnitTest = true }; + Generator.GenerateSource(compilation, typeSymbolsCache, memberAccessExpressions, builder, CancellationToken.None); + var result = builder.ToString(); + + // Assert +#if NET5_0_OR_GREATER + _ = result.Must() + .BeEqualTo(await File.ReadAllTextAsync(expected)); +#else + _ = result.Must() + .BeEqualTo(File.ReadAllText(expected)); +#endif + } + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj b/NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj index 0158308fc..39ba44d1e 100644 --- a/NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj +++ b/NetFabric.Hyperlinq.UnitTests/NetFabric.Hyperlinq.UnitTests.csproj @@ -1,32 +1,32 @@  - net48;netcoreapp2.1;netcoreapp3.1;net6.0 + net6.0 + false + true - + + + NOT_TESTING + + - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - + + + - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - runtime; build; native; contentfiles; analyzers - - - - - @@ -34,7 +34,9 @@ - + + Always + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..c5d1c5ad6 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,43 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + //[MethodImpl(MethodImplOptions.AggressiveInlining)] + //public static AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_> AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) + // => new(source, source); + + //public readonly struct AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ + // : IValueEnumerable.Enumerator> + // where TEnumerable : IEnumerable + //{ + // readonly TestEnumerableWithValueTypeEnumerator source; + // readonly TEnumerable source2; + + // internal AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_(TestEnumerableWithValueTypeEnumerator source, TEnumerable source2) + // => (this.source, this.source2) = (source, source2); + + // // Implement IValueEnumerable.Enumerator> + + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public TestEnumerableWithValueTypeEnumerator.Enumerator GetEnumerator() => source.GetEnumerator(); + + // IEnumerator IEnumerable.GetEnumerator() => source2.GetEnumerator(); + + // IEnumerator IEnumerable.GetEnumerator() => source2.GetEnumerator(); + //} + + public static GeneratedExtensionMethods.AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ AsEnumerable(this GeneratedExtensionMethods.AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ source) + => NetFabric.Hyperlinq.ValueEnumerableExtensions.AsEnumerable.Enumerator, TestValueType>(source); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.IReadOnlyList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.IReadOnlyList.cs new file mode 100644 index 000000000..fc53886f4 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.IReadOnlyList.cs @@ -0,0 +1,133 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_System_Collections_Generic_IReadOnlyList_TestValueType_ AsValueEnumerable(this System.Collections.Generic.IReadOnlyList source) + => new(source); + + public readonly struct AsValueEnumerable_System_Collections_Generic_IReadOnlyList_TestValueType_ + : IValueReadOnlyList>, IList + { + readonly System.Collections.Generic.IReadOnlyList source; + + internal AsValueEnumerable_System_Collections_Generic_IReadOnlyList_TestValueType_(System.Collections.Generic.IReadOnlyList source) + => this.source = source; + + // Implement IValueEnumerable> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ValueEnumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + public bool Contains(TestValueType item) + { + if (Count is 0) + return false; + + if (source is ICollection collection) + return collection.Contains(item); + + using var enumerator = GetEnumerator(); + while (enumerator.MoveNext()) + { + if (EqualityComparer.Default.Equals(enumerator.Current, item)) + return true; + } + return false; + } + + public void CopyTo(TestValueType[] array, int arrayIndex) + { + if (Count is 0) + return; + + if (array.Length - arrayIndex < Count) + throw new ArgumentException("Destination array was not long enough. Check the destination index, length, and the array's lower bounds.", nameof(array)); + + if (source is ICollection collection) + { + collection.CopyTo(array, arrayIndex); + return; + } + + using var enumerator = GetEnumerator(); + if (arrayIndex is 0 && array.Length == Count) + { + for (var index = 0; index < array.Length && enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + else + { + checked + { + for (var index = arrayIndex; enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + } + } + + // Implement IList + + public TestValueType this[int index] => source[index]; + + TestValueType IList.this[int index] + { + get => source[index]; + set => throw new NotSupportedException(); + } + + void IList.Insert(int index, TestValueType item) => throw new NotSupportedException(); + + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + public int IndexOf(TestValueType item) + { + if (Count is not 0) + { + if (source is IList list) + return list.IndexOf(item); + + checked + { + var index = 0; + foreach (var current in source) + { + if (EqualityComparer.Default.Equals(current, item)) + return index; + + index++; + } + } + } + return -1; + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs new file mode 100644 index 000000000..0c28f1d9f --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.Repeat.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable AsValueEnumerable(this NetFabric.Hyperlinq.ValueEnumerable.RepeatEnumerable source) + => source; +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestCollection.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestCollection.cs new file mode 100644 index 000000000..b7dd4b562 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestCollection.cs @@ -0,0 +1,56 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestCollection_TestValueType_ AsValueEnumerable(this TestCollection source) + => new(source); + + public readonly struct AsValueEnumerable_TestCollection_TestValueType_ + : IValueReadOnlyCollection.Enumerator>, ICollection + { + readonly TestCollection source; + + internal AsValueEnumerable_TestCollection_TestValueType_(TestCollection source) + => this.source = source; + + // Implement IValueEnumerable.Enumerator> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public TestCollection.Enumerator GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(TestValueType item) => source.Contains(item); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CopyTo(TestValueType[] array, int arrayIndex) => source.CopyTo(array, arrayIndex); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs new file mode 100644 index 000000000..8b7764809 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs @@ -0,0 +1,62 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestEnumerableWithInterfacelessPublicEnumerator_TestValueType_ AsValueEnumerable(this TestEnumerableWithInterfacelessPublicEnumerator source) + => new(source); + + public readonly struct AsValueEnumerable_TestEnumerableWithInterfacelessPublicEnumerator_TestValueType_ + : IValueEnumerable + { + readonly TestEnumerableWithInterfacelessPublicEnumerator source; + + internal AsValueEnumerable_TestEnumerableWithInterfacelessPublicEnumerator_TestValueType_(TestEnumerableWithInterfacelessPublicEnumerator source) + => this.source = source; + + // Implement IValueEnumerable + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Enumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public struct Enumerator : IEnumerator + { + readonly TestEnumerableWithInterfacelessPublicEnumerator.Enumerator source; + + internal Enumerator(TestEnumerableWithInterfacelessPublicEnumerator.Enumerator source) + => this.source = source; + + public TestValueType Current + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source.Current; + } + + object? IEnumerator.Current => source.Current; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool MoveNext() => source.MoveNext(); + + public void Reset() => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() { } + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs new file mode 100644 index 000000000..ac52dc301 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs @@ -0,0 +1,62 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestEnumerableWithNoInterfaces_TestValueType_ AsValueEnumerable(this TestEnumerableWithNoInterfaces source) + => new(source); + + public readonly struct AsValueEnumerable_TestEnumerableWithNoInterfaces_TestValueType_ + : IValueEnumerable + { + readonly TestEnumerableWithNoInterfaces source; + + internal AsValueEnumerable_TestEnumerableWithNoInterfaces_TestValueType_(TestEnumerableWithNoInterfaces source) + => this.source = source; + + // Implement IValueEnumerable + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Enumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public struct Enumerator : IEnumerator + { + readonly TestEnumerableWithNoInterfaces.Enumerator source; + + internal Enumerator(TestEnumerableWithNoInterfaces.Enumerator source) + => this.source = source; + + public TestValueType Current + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source.Current; + } + + object? IEnumerator.Current => source.Current; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool MoveNext() => source.MoveNext(); + + public void Reset() => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() { } + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs new file mode 100644 index 000000000..13eca99d5 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs @@ -0,0 +1,63 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose_TestValueType_ AsValueEnumerable(this TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source) + => new(source); + + public readonly struct AsValueEnumerable_TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose_TestValueType_ + : IValueEnumerable + { + readonly TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source; + + internal AsValueEnumerable_TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose_TestValueType_(TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose source) + => this.source = source; + + // Implement IValueEnumerable + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Enumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + public struct Enumerator : IEnumerator + { + readonly TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.Enumerator source; + + internal Enumerator(TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.Enumerator source) + => this.source = source; + + public TestValueType Current + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => source.Current; + } + + object? IEnumerator.Current => source.Current; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool MoveNext() => source.MoveNext(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Reset() => source.Reset(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() => source.Dispose(); + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs new file mode 100644 index 000000000..407d1fa67 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs @@ -0,0 +1,38 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator_TestValueType_ AsValueEnumerable(this TestEnumerableWithReferenceTypeEnumerator source) + => new(source); + + public readonly struct AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator_TestValueType_ + : IValueEnumerable> + { + readonly TestEnumerableWithReferenceTypeEnumerator source; + + internal AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator_TestValueType_(TestEnumerableWithReferenceTypeEnumerator source) + => this.source = source; + + // Implement IValueEnumerable> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ValueEnumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..2e787b696 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,38 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) + => new(source); + + public readonly struct AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ + : IValueEnumerable.Enumerator> + { + readonly TestEnumerableWithValueTypeEnumerator source; + + internal AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_(TestEnumerableWithValueTypeEnumerator source) + => this.source = source; + + // Implement IValueEnumerable.Enumerator> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public TestEnumerableWithValueTypeEnumerator.Enumerator GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestList.cs new file mode 100644 index 000000000..fcbae6d1f --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestList.cs @@ -0,0 +1,73 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestList_TestValueType_ AsValueEnumerable(this TestList source) + => new(source); + + public readonly struct AsValueEnumerable_TestList_TestValueType_ + : IValueReadOnlyList.Enumerator>, IList + { + readonly TestList source; + + internal AsValueEnumerable_TestList_TestValueType_(TestList source) + => this.source = source; + + // Implement IValueEnumerable.Enumerator> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public TestList.Enumerator GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(TestValueType item) => source.Contains(item); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CopyTo(TestValueType[] array, int arrayIndex) => source.CopyTo(array, arrayIndex); + + // Implement IList + + public TestValueType this[int index] => source[index]; + + TestValueType IList.this[int index] + { + get => source[index]; + set => throw new NotSupportedException(); + } + + void IList.Insert(int index, TestValueType item) => throw new NotSupportedException(); + + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int IndexOf(TestValueType item) => source.IndexOf(item); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestListWithExplicitInterfaces.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestListWithExplicitInterfaces.cs new file mode 100644 index 000000000..c1a97176e --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestListWithExplicitInterfaces.cs @@ -0,0 +1,87 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestListWithExplicitInterfaces_TestValueType_> AsValueEnumerable(this TestListWithExplicitInterfaces source) + => new(source); + + public readonly struct AsValueEnumerable_TestListWithExplicitInterfaces_TestValueType_ + : IValueReadOnlyList>, IList + where TEnumerable : IList + { + readonly TEnumerable source; + + internal AsValueEnumerable_TestListWithExplicitInterfaces_TestValueType_(TEnumerable source) + => this.source = source; + + // Implement IValueEnumerable> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ValueEnumerator GetEnumerator() => new(source.GetEnumerator()); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + public void CopyTo(Span span) + { + if (Count is 0) return; + if (span.Length < Count) throw new ArgumentException("Destination span was not long enough.", nameof(span)); + + var index = 0; + foreach (var current in this) + { + span[index] = current; + checked { index++; } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(TestValueType item) => source.Contains(item); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void CopyTo(TestValueType[] array, int arrayIndex) => source.CopyTo(array, arrayIndex); + + // Implement IList + + public TestValueType this[int index] => source[index]; + + TestValueType IList.this[int index] + { + get => source[index]; + set => throw new NotSupportedException(); + } + + void IList.Insert(int index, TestValueType item) => throw new NotSupportedException(); + + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int IndexOf(TestValueType item) => source.IndexOf(item); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyCollection.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyCollection.cs new file mode 100644 index 000000000..a1e9b7b6c --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyCollection.cs @@ -0,0 +1,88 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestReadOnlyCollection_TestValueType_ AsValueEnumerable(this TestReadOnlyCollection source) + => new(source); + + public readonly struct AsValueEnumerable_TestReadOnlyCollection_TestValueType_ + : IValueReadOnlyCollection.Enumerator>, ICollection + { + readonly TestReadOnlyCollection source; + + internal AsValueEnumerable_TestReadOnlyCollection_TestValueType_(TestReadOnlyCollection source) + => this.source = source; + + // Implement IValueEnumerable.Enumerator> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public TestReadOnlyCollection.Enumerator GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + public bool Contains(TestValueType item) + { + if (Count is 0) + return false; + + using var enumerator = GetEnumerator(); + while (enumerator.MoveNext()) + { + if (EqualityComparer.Default.Equals(enumerator.Current, item)) + return true; + } + return false; + } + + public void CopyTo(TestValueType[] array, int arrayIndex) + { + if (Count is 0) + return; + + if (array.Length - arrayIndex < Count) + throw new ArgumentException("Destination array was not long enough. Check the destination index, length, and the array's lower bounds.", nameof(array)); + + using var enumerator = GetEnumerator(); + if (arrayIndex is 0 && array.Length == Count) + { + for (var index = 0; index < array.Length && enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + else + { + checked + { + for (var index = arrayIndex; enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + } + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyList.cs new file mode 100644 index 000000000..2aa13a609 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestReadOnlyList.cs @@ -0,0 +1,121 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static AsValueEnumerable_TestReadOnlyList_TestValueType_ AsValueEnumerable(this TestReadOnlyList source) + => new(source); + + public readonly struct AsValueEnumerable_TestReadOnlyList_TestValueType_ + : IValueReadOnlyList.Enumerator>, IList + { + readonly TestReadOnlyList source; + + internal AsValueEnumerable_TestReadOnlyList_TestValueType_(TestReadOnlyList source) + => this.source = source; + + // Implement IValueEnumerable.Enumerator> + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public TestReadOnlyList.Enumerator GetEnumerator() => source.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + + // Implement ICollection + + public int Count => source.Count; + + public bool IsReadOnly => true; + + void ICollection.Add(TestValueType item) => throw new NotSupportedException(); + + bool ICollection.Remove(TestValueType item) => throw new NotSupportedException(); + + void ICollection.Clear() => throw new NotSupportedException(); + + public bool Contains(TestValueType item) + { + if (Count is 0) + return false; + + using var enumerator = GetEnumerator(); + while (enumerator.MoveNext()) + { + if (EqualityComparer.Default.Equals(enumerator.Current, item)) + return true; + } + return false; + } + + public void CopyTo(TestValueType[] array, int arrayIndex) + { + if (Count is 0) + return; + + if (array.Length - arrayIndex < Count) + throw new ArgumentException("Destination array was not long enough. Check the destination index, length, and the array's lower bounds.", nameof(array)); + + using var enumerator = GetEnumerator(); + if (arrayIndex is 0 && array.Length == Count) + { + for (var index = 0; index < array.Length && enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + else + { + checked + { + for (var index = arrayIndex; enumerator.MoveNext(); index++) + array[index] = enumerator.Current; + } + } + } + + // Implement IList + + public TestValueType this[int index] => source[index]; + + TestValueType IList.this[int index] + { + get => source[index]; + set => throw new NotSupportedException(); + } + + void IList.Insert(int index, TestValueType item) => throw new NotSupportedException(); + + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + public int IndexOf(TestValueType item) + { + if (Count is not 0) + { + checked + { + var index = 0; + foreach (var current in source) + { + if (EqualityComparer.Default.Equals(current, item)) + return index; + + index++; + } + } + } + return -1; + } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs new file mode 100644 index 000000000..c3f0ec230 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/AsValueEnumerable.TestValueEnumerable.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TestValueEnumerable AsValueEnumerable(this TestValueEnumerable source) + => source; +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Array.cs new file mode 100644 index 000000000..a640141f5 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Array.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Count(this NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable source, System.Func predicate) + => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Count, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType, NetFabric.Hyperlinq.FunctionWrapper>(source, predicate); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Span.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Span.cs new file mode 100644 index 000000000..53c5b7c63 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Count.Span.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Count(this NetFabric.Hyperlinq.ArrayExtensions.SpanValueEnumerable source, Func predicate) + => NetFabric.Hyperlinq.ArrayExtensions.Count(source.Span, predicate); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Empty.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Empty.cs new file mode 100644 index 000000000..dbe7e1354 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Empty.cs @@ -0,0 +1,16 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.Array.cs new file mode 100644 index 000000000..af70ff565 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.Array.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static NetFabric.Hyperlinq.ValueReadOnlyListExtensions.SelectEnumerable, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType, TestReferenceType, NetFabric.Hyperlinq.FunctionWrapper> Select(this NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable source, System.Func selector) + => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Select, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType, TestReferenceType>(source, selector); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..2410968fe --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Select.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,45 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + //[MethodImpl(MethodImplOptions.AggressiveInlining)] + //public static AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_> AsValueEnumerable(this TestEnumerableWithValueTypeEnumerator source) + // => new(source, source); + + //public readonly struct AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ + // : IValueEnumerable.Enumerator> + // where TEnumerable : IEnumerable + //{ + // readonly TestEnumerableWithValueTypeEnumerator source; + // readonly TEnumerable source2; + + // internal AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_(TestEnumerableWithValueTypeEnumerator source, TEnumerable source2) + // => (this.source, this.source2) = (source, source2); + + // // Implement IValueEnumerable.Enumerator> + + // [MethodImpl(MethodImplOptions.AggressiveInlining)] + // public TestEnumerableWithValueTypeEnumerator.Enumerator GetEnumerator() => source.GetEnumerator(); + + // IEnumerator IEnumerable.GetEnumerator() => source2.GetEnumerator(); + + // IEnumerator IEnumerable.GetEnumerator() => source2.GetEnumerator(); + //} + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ValueEnumerableExtensions.SelectEnumerable.Enumerator, TestValueType, TestReferenceType, NetFabric.Hyperlinq.FunctionWrapper> Select(this GeneratedExtensionMethods.AsValueEnumerable_TestEnumerableWithValueTypeEnumerator_TestValueType_ source, System.Func selector) + => NetFabric.Hyperlinq.ValueEnumerableExtensions.Select.Enumerator, TestValueType, TestReferenceType, NetFabric.Hyperlinq.FunctionWrapper>(source, selector); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Skip.Take.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Skip.Take.Array.cs new file mode 100644 index 000000000..b26994268 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Skip.Take.Array.cs @@ -0,0 +1,24 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static NetFabric.Hyperlinq.ValueReadOnlyCollectionExtensions.SkipTakeEnumerable, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType> Skip(this NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable source, int count) + => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Skip, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType>(source, count); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static NetFabric.Hyperlinq.ValueReadOnlyCollectionExtensions.SkipTakeEnumerable, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType> Take(this NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable source, int count) + => NetFabric.Hyperlinq.ValueReadOnlyCollectionExtensions.Take, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType>(source, count); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Results/Where.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Where.Array.cs new file mode 100644 index 000000000..e3626ae0d --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Results/Where.Array.cs @@ -0,0 +1,20 @@ +#nullable enable + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; + +namespace NetFabric.Hyperlinq; + +static partial class GeneratedExtensionMethods +{ + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static NetFabric.Hyperlinq.ValueReadOnlyCollectionExtensions.WhereEnumerable, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType, NetFabric.Hyperlinq.FunctionWrapper> Where(this NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable source, System.Func selector) + => NetFabric.Hyperlinq.ValueReadOnlyListExtensions.Where, NetFabric.Hyperlinq.ArrayExtensions.ArraySegmentValueEnumerable.DisposableEnumerator, TestValueType, NetFabric.Hyperlinq.FunctionWrapper>(source, selector); +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..c95d5f829 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsEnumerable.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Count_TestEnumerableWithValueTypeEnumerator() + { + _ = new TestEnumerableWithValueTypeEnumerator() + .AsValueEnumerable() + .AsEnumerable(); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs new file mode 100644 index 000000000..0b0b74e93 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty.cs @@ -0,0 +1,28 @@ +using System; +//using NetFabric.Hyperlinq; => DO NOT UNCOMMENT + +partial class TestsSource +{ + static void AsValueEnumerable_Empty() + { + // test calling AsValueEnumerable() for types that don't need source generation + // with NetFabric.Hyperlinq namespace NOT in a using clause + +#if !NOT_TESTING + var array = Array.Empty(); + + _ = array.AsValueEnumerable(); + _ = new ArraySegment(array).AsValueEnumerable(); + + _ = array.AsMemory().AsValueEnumerable(); + _ = ((ReadOnlyMemory)array.AsMemory()).AsValueEnumerable(); + + _ = array.AsSpan().AsValueEnumerable(); + _ = ((ReadOnlySpan)array.AsSpan()).AsValueEnumerable(); + + var list = new List(); + _ = list.AsValueEnumerable(); +#endif + } +} + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs new file mode 100644 index 000000000..6c0371f60 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty2.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using NetFabric.Hyperlinq; // namespace is known at compile time + +partial class TestsSource +{ + static void AsValueEnumerable_Empty2() + { + // test calling AsValueEnumerable() for types that don't need source generation + + var array = Array.Empty(); + + _ = array.AsValueEnumerable(); + _ = ArrayExtensions.AsValueEnumerable(array); + _ = new ArraySegment(array).AsValueEnumerable(); + + _ = array.AsMemory().AsValueEnumerable(); + _ = ((ReadOnlyMemory)array.AsMemory()).AsValueEnumerable(); + + _ = array.AsSpan().AsValueEnumerable(); + _ = ((ReadOnlySpan)array.AsSpan()).AsValueEnumerable(); + + var list = new List(); + _ = list.AsValueEnumerable(); + } +} + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty3.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty3.cs new file mode 100644 index 000000000..d7d379d2c --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Empty3.cs @@ -0,0 +1,18 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; // namespace is known at compile time + +partial class TestsSource +{ + static void AsValueEnumerable_Empty3() + { + var valueEnumerable = Array + .Empty() + .AsValueEnumerable(); + + _ = Enumerable.Count(valueEnumerable); + _ = Enumerable.Count(valueEnumerable, _ => true); + _ = Enumerable.Take(Enumerable.Skip(valueEnumerable, 1), 2); + } +} + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.IReadOnlyList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.IReadOnlyList.cs new file mode 100644 index 000000000..33b500a91 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.IReadOnlyList.cs @@ -0,0 +1,17 @@ +using NetFabric.Hyperlinq; +using System.Collections.Generic; + +partial class TestsSource +{ + static void AsValueEnumerable_IReadOnlyList() + { + // test calling AsValueEnumerable() on an IReadOnlyList<> + IReadOnlyList list = new TestReadOnlyList(); + _ = list.AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs new file mode 100644 index 000000000..834978c04 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.Repeat.cs @@ -0,0 +1,13 @@ +using System; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_Repeat() + { + // test calling AsValueEnumerable() for types that implement IValueEnumerable<,> + + _ = ValueEnumerable.Repeat(0, 100).AsValueEnumerable(); + } +} + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestCollection.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestCollection.cs new file mode 100644 index 000000000..c66f27f10 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestCollection.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_Collection() + { + // test calling AsValueEnumerable() on an implementation of ICollection<> + _ = new TestCollection().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs new file mode 100644 index 000000000..d9734c3b4 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithInterfacelessPublicEnumerator.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_TestEnumerableWithInterfacelessPublicEnumerator() + { + // test calling AsValueEnumerable() for types that implement IEnumerable<> + // but the public GetEnumerator() returns a type that doesn't implement IEnumerator<> + + _ = new TestEnumerableWithInterfacelessPublicEnumerator().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs new file mode 100644 index 000000000..12071aee1 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfaces.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_TestEnumerableWithNoInterfaces() + { + // test calling AsValueEnumerable() for types that do not implement IEnumerable<> + // but the public GetEnumerator() returns a type that doesn't implement IEnumerator<> + + _ = new TestEnumerableWithNoInterfaces().AsValueEnumerable(); + } +} + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs new file mode 100644 index 000000000..7554e76fe --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose() + { + // test calling AsValueEnumerable() for types that do not implement IEnumerable<> + // and the public GetEnumerator() returns a type that implement IDisposable and has a Reset() method + + _ = new TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs new file mode 100644 index 000000000..304df9a9d --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithReferenceTypeEnumerator.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_TestEnumerableWithReferenceTypeEnumerator() + { + // test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is not a value type + + _ = new TestEnumerableWithReferenceTypeEnumerator().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..1ff2412ec --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_EnumerableWithValueTypeEnumerator() + { + // test calling AsValueEnumerable() for types that implement IEnumerable<> and the enumerator is a value type + + _ = new TestEnumerableWithValueTypeEnumerator().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestList.cs new file mode 100644 index 000000000..f1421d0ab --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestList.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_List() + { + // test calling AsValueEnumerable() on an implementation of IList<> + _ = new TestList().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestListWithExplicitInterfaces.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestListWithExplicitInterfaces.cs new file mode 100644 index 000000000..72d84d63f --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestListWithExplicitInterfaces.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_ReadOnlyListWithExplicitInterfaces() + { + // test calling AsValueEnumerable() on an IValueEnumerable + _ = new TestListWithExplicitInterfaces().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyCollection.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyCollection.cs new file mode 100644 index 000000000..15c9cce44 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyCollection.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_ReadOnlyCollection() + { + // test calling AsValueEnumerable() on an IValueEnumerable + _ = new TestReadOnlyCollection().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyList.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyList.cs new file mode 100644 index 000000000..cb02ca0d8 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestReadOnlyList.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_ReadOnlyList() + { + // test calling AsValueEnumerable() on an IValueEnumerable + _ = new TestReadOnlyList().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs new file mode 100644 index 000000000..fbb432ef8 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/AsValueEnumerable.TestValueEnumerable.cs @@ -0,0 +1,15 @@ +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void AsValueEnumerable_ValueEnumerable() + { + // test calling AsValueEnumerable() on an IValueEnumerable + _ = new TestValueEnumerable().AsValueEnumerable(); + } +} + + + + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/Enumerables.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/Enumerables.cs new file mode 100644 index 000000000..283f0f9df --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/Enumerables.cs @@ -0,0 +1,327 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class TestEnumerableWithNoInterfaces +{ + public Enumerator GetEnumerator() + => new(); + + public readonly struct Enumerator + { + public T Current + => default!; + + public bool MoveNext() + => false; + } +} + +public class TestEnumerableWithNoInterfacesButEnumeratorWithResetAndDispose +{ + public Enumerator GetEnumerator() + => new(); + + public readonly struct Enumerator + : IDisposable + { + public T Current + => default!; + + public bool MoveNext() + => false; + + public void Reset() + { } + + public void Dispose() + { } + } +} + +public readonly struct TestEnumerableWithInterfacelessPublicEnumerator + : IEnumerable +{ + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new DisposableEnumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new DisposableEnumerator(); + + public struct Enumerator + { + public T Current + => default!; + + public bool MoveNext() + => false; + } + + class DisposableEnumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + +public readonly struct TestEnumerableWithValueTypeEnumerator + : IEnumerable +{ + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + public readonly struct Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + + +public readonly struct TestEnumerableWithReferenceTypeEnumerator + : IEnumerable +{ + public IEnumerator GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + class Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + +public readonly struct TestReadOnlyCollection + : IReadOnlyCollection +{ + public int Count => default; + + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + public readonly struct Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + +public readonly struct TestCollection + : ICollection +{ + public int Count => default; + + public bool IsReadOnly => true; + public bool Contains(T item) => default; + public void CopyTo(T[] array, int arrayIndex) { } + void ICollection.Add(T item) => throw new NotSupportedException(); + bool ICollection.Remove(T item) => throw new NotSupportedException(); + void ICollection.Clear() => throw new NotSupportedException(); + + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + public readonly struct Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + +public readonly struct TestReadOnlyList + : IReadOnlyList +{ + public int Count => default; + + public T this[int index] => default!; + + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + public readonly struct Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + +public readonly struct TestList + : IList +{ + public int Count => default; + + public bool IsReadOnly => true; + + public T this[int index] + { + get => default!; + set => throw new NotSupportedException(); + } + + public bool Contains(T item) => default; + public void CopyTo(T[] array, int arrayIndex) { } + void ICollection.Add(T item) => throw new NotSupportedException(); + bool ICollection.Remove(T item) => throw new NotSupportedException(); + void ICollection.Clear() => throw new NotSupportedException(); + + public int IndexOf(T item) => -1; + void IList.Insert(int index, T item) => throw new NotSupportedException(); + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + public Enumerator GetEnumerator() + => new(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + public readonly struct Enumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} + + +public readonly struct TestListWithExplicitInterfaces + : IList +{ + int ICollection.Count => default; + + bool ICollection.IsReadOnly => true; + + T IList.this[int index] + { + get => default!; + set => throw new NotSupportedException(); + } + + bool ICollection.Contains(T item) => default; + void ICollection.CopyTo(T[] array, int arrayIndex) { } + void ICollection.Add(T item) => throw new NotSupportedException(); + bool ICollection.Remove(T item) => throw new NotSupportedException(); + void ICollection.Clear() => throw new NotSupportedException(); + + int IList.IndexOf(T item) => -1; + void IList.Insert(int index, T item) => throw new NotSupportedException(); + void IList.RemoveAt(int index) => throw new NotSupportedException(); + + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + IEnumerator IEnumerable.GetEnumerator() + => new Enumerator(); + + class Enumerator + : IEnumerator + { + T IEnumerator.Current + => default!; + object? IEnumerator.Current + => default; + + bool IEnumerator.MoveNext() + => false; + + void IEnumerator.Reset() + { } + void IDisposable.Dispose() + { } + } +} + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ItemTypes.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ItemTypes.cs new file mode 100644 index 000000000..1249d551d --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ItemTypes.cs @@ -0,0 +1,7 @@ +public struct TestValueType +{ +} + +public class TestReferenceType +{ +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ValueEnumerables.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ValueEnumerables.cs new file mode 100644 index 000000000..0819feb46 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Common/ValueEnumerables.cs @@ -0,0 +1,45 @@ +using NetFabric.Hyperlinq; +using System.Collections; +using System.Collections.Generic; + +public class TestValueEnumerable + : IValueEnumerable.DisposableEnumerator> +{ + public Enumerator GetEnumerator() + => new(); + + DisposableEnumerator IValueEnumerable.GetEnumerator() + => new(); + + IEnumerator IEnumerable.GetEnumerator() + => new DisposableEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() + => new DisposableEnumerator(); + + public readonly struct Enumerator + { + public T Current + => default!; + + public bool MoveNext() + => false; + } + + public readonly struct DisposableEnumerator + : IEnumerator + { + public T Current + => default!; + object? IEnumerator.Current + => default; + + public bool MoveNext() + => false; + + public void Reset() + { } + public void Dispose() + { } + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Array.cs new file mode 100644 index 000000000..59af328dd --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Array.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Count_ArraySegmentValueEnumerable() + { + _ = Array.Empty() + .AsValueEnumerable() + .Count(_ => true); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Span.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Span.cs new file mode 100644 index 000000000..fc14b2aab --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Count.Span.cs @@ -0,0 +1,16 @@ +using System; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Count_SpanValueEnumerable() + { +#if !NOT_TESTING + _ = Array.Empty().AsSpan() + .AsValueEnumerable() + .Count(_ => true); +#endif + } +} + + diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.Array.cs new file mode 100644 index 000000000..3fd1cfea8 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.Array.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Select_ArraySegmentValueEnumerable() + { + _ = Array.Empty() + .AsValueEnumerable() + .Select(_ => new TestReferenceType()); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.TestEnumerableWithValueTypeEnumerator.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.TestEnumerableWithValueTypeEnumerator.cs new file mode 100644 index 000000000..32fd6358f --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Select.TestEnumerableWithValueTypeEnumerator.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Select_TestEnumerableWithValueTypeEnumerator() + { + _ = new TestEnumerableWithValueTypeEnumerator() + .AsValueEnumerable() + .Select(_ => new TestReferenceType()); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Skip.Take.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Skip.Take.Array.cs new file mode 100644 index 000000000..346966ae9 --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Skip.Take.Array.cs @@ -0,0 +1,14 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Skip_Take_ArraySegmentValueEnumerable() + { + _ = Array.Empty() + .AsValueEnumerable() + .Skip(1) + .Take(2); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/TestData/Source/Where.Array.cs b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Where.Array.cs new file mode 100644 index 000000000..3062e609b --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/TestData/Source/Where.Array.cs @@ -0,0 +1,13 @@ +using System; +using System.Linq; +using NetFabric.Hyperlinq; + +partial class TestsSource +{ + static void Where_ArraySegmentValueEnumerable() + { + _ = Array.Empty() + .AsValueEnumerable() + .Where(_ => true); + } +} diff --git a/NetFabric.Hyperlinq.UnitTests/Verifier.cs b/NetFabric.Hyperlinq.UnitTests/Verifier.cs new file mode 100644 index 000000000..102ea391c --- /dev/null +++ b/NetFabric.Hyperlinq.UnitTests/Verifier.cs @@ -0,0 +1,49 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Text; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.IO; +using System.Linq; + +namespace NetFabric.Hyperlinq.SourceGenerator.UnitTests +{ + sealed class Verifier + { + static readonly string defaultFilePathPrefix = "Test"; + static readonly string testProjectName = "TestProject"; + + public static Project CreateProject(IEnumerable sources) + { + var projectId = ProjectId.CreateNewId(debugName: testProjectName); + + var coreLibPath = typeof(object).Assembly.Location; + var coreLibDirectory = Path.GetDirectoryName(coreLibPath)!; + var references = new[] { + MetadataReference.CreateFromFile(coreLibPath), + MetadataReference.CreateFromFile(Path.Combine(coreLibDirectory, "netstandard.dll")), + MetadataReference.CreateFromFile(Path.Combine(coreLibDirectory, "System.Runtime.dll")), + MetadataReference.CreateFromFile(Path.Combine(coreLibDirectory, "System.Collections.dll")), + MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location), + MetadataReference.CreateFromFile(typeof(ImmutableArray<>).Assembly.Location), + MetadataReference.CreateFromFile(typeof(IValueEnumerable<,>).Assembly.Location), + MetadataReference.CreateFromFile(typeof(ValueEnumerableExtensions).Assembly.Location), + }; + var solution = new AdhocWorkspace() + .CurrentSolution + .AddProject(projectId, testProjectName, testProjectName, LanguageNames.CSharp) + .AddMetadataReferences(projectId, references) + .WithProjectCompilationOptions(projectId, new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + + var count = 0; + foreach (var source in sources) + { + var newFileName = defaultFilePathPrefix + count + ".cs"; + var documentId = DocumentId.CreateNewId(projectId, debugName: newFileName); + solution = solution.AddDocument(documentId, newFileName, SourceText.From(source)); + count++; + } + return solution.GetProject(projectId)!; + } + } +} diff --git a/NetFabric.Hyperlinq.sln b/NetFabric.Hyperlinq.sln index 77877123b..ee9b89340 100644 --- a/NetFabric.Hyperlinq.sln +++ b/NetFabric.Hyperlinq.sln @@ -1,12 +1,10 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28516.95 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31423.177 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq", "NetFabric.Hyperlinq\NetFabric.Hyperlinq.csproj", "{EEEAA31B-434E-4849-A3E5-FA9664F5CE9B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.UnitTests", "NetFabric.Hyperlinq.UnitTests\NetFabric.Hyperlinq.UnitTests.csproj", "{FE0CFD9E-7685-4595-8691-5364228722E9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{2C452DA5-FE07-451C-BFE1-AD14A57F7B09}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig @@ -24,13 +22,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Benchmarks", "NetFabric.Hyperlinq.Benchmarks\NetFabric.Hyperlinq.Benchmarks.csproj", "{02EE275F-6E2D-444A-AB1F-9BCD02DEA204}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.SourceGenerator", "NetFabric.Hyperlinq.SourceGenerator\NetFabric.Hyperlinq.SourceGenerator.csproj", "{B8C004E3-F59E-4017-8781-C0F99B61BDEF}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Abstractions", "NetFabric.Hyperlinq.Abstractions\NetFabric.Hyperlinq.Abstractions.csproj", "{6981E761-E698-437D-AF63-0E80844B7D41}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.SourceGenerator.UnitTests", "NetFabric.Hyperlinq.SourceGenerator.UnitTests\NetFabric.Hyperlinq.SourceGenerator.UnitTests.csproj", "{12F96462-A2F8-4FBE-B4F5-29BA6A6DB4D9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Core", "NetFabric.Hyperlinq.Core\NetFabric.Hyperlinq.Core.csproj", "{9EA4EA87-7656-48BA-BE7F-E5CC1B48512D}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Abstractions", "NetFabric.Hyperlinq.Abstractions\NetFabric.Hyperlinq.Abstractions.csproj", "{6981E761-E698-437D-AF63-0E80844B7D41}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Core.UnitTests", "NetFabric.Hyperlinq.Core.UnitTests\NetFabric.Hyperlinq.Core.UnitTests.csproj", "{794C4984-BB46-4A50-9BC1-53831B5C8002}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.Immutable", "NetFabric.Hyperlinq.Immutable\NetFabric.Hyperlinq.Immutable.csproj", "{6CB7E269-91CB-47CC-BF9F-67956D5E0F7E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NetFabric.Hyperlinq.UnitTests", "NetFabric.Hyperlinq.UnitTests\NetFabric.Hyperlinq.UnitTests.csproj", "{F0A7B925-30F2-4FAA-97E6-7848B3E104B6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -42,30 +40,26 @@ Global {EEEAA31B-434E-4849-A3E5-FA9664F5CE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU {EEEAA31B-434E-4849-A3E5-FA9664F5CE9B}.Release|Any CPU.ActiveCfg = Release|Any CPU {EEEAA31B-434E-4849-A3E5-FA9664F5CE9B}.Release|Any CPU.Build.0 = Release|Any CPU - {FE0CFD9E-7685-4595-8691-5364228722E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FE0CFD9E-7685-4595-8691-5364228722E9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FE0CFD9E-7685-4595-8691-5364228722E9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FE0CFD9E-7685-4595-8691-5364228722E9}.Release|Any CPU.Build.0 = Release|Any CPU {02EE275F-6E2D-444A-AB1F-9BCD02DEA204}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02EE275F-6E2D-444A-AB1F-9BCD02DEA204}.Debug|Any CPU.Build.0 = Debug|Any CPU {02EE275F-6E2D-444A-AB1F-9BCD02DEA204}.Release|Any CPU.ActiveCfg = Release|Any CPU {02EE275F-6E2D-444A-AB1F-9BCD02DEA204}.Release|Any CPU.Build.0 = Release|Any CPU - {B8C004E3-F59E-4017-8781-C0F99B61BDEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B8C004E3-F59E-4017-8781-C0F99B61BDEF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B8C004E3-F59E-4017-8781-C0F99B61BDEF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B8C004E3-F59E-4017-8781-C0F99B61BDEF}.Release|Any CPU.Build.0 = Release|Any CPU - {12F96462-A2F8-4FBE-B4F5-29BA6A6DB4D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {12F96462-A2F8-4FBE-B4F5-29BA6A6DB4D9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {12F96462-A2F8-4FBE-B4F5-29BA6A6DB4D9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {12F96462-A2F8-4FBE-B4F5-29BA6A6DB4D9}.Release|Any CPU.Build.0 = Release|Any CPU {6981E761-E698-437D-AF63-0E80844B7D41}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6981E761-E698-437D-AF63-0E80844B7D41}.Debug|Any CPU.Build.0 = Debug|Any CPU {6981E761-E698-437D-AF63-0E80844B7D41}.Release|Any CPU.ActiveCfg = Release|Any CPU {6981E761-E698-437D-AF63-0E80844B7D41}.Release|Any CPU.Build.0 = Release|Any CPU - {6CB7E269-91CB-47CC-BF9F-67956D5E0F7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6CB7E269-91CB-47CC-BF9F-67956D5E0F7E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6CB7E269-91CB-47CC-BF9F-67956D5E0F7E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6CB7E269-91CB-47CC-BF9F-67956D5E0F7E}.Release|Any CPU.Build.0 = Release|Any CPU + {9EA4EA87-7656-48BA-BE7F-E5CC1B48512D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9EA4EA87-7656-48BA-BE7F-E5CC1B48512D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9EA4EA87-7656-48BA-BE7F-E5CC1B48512D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9EA4EA87-7656-48BA-BE7F-E5CC1B48512D}.Release|Any CPU.Build.0 = Release|Any CPU + {794C4984-BB46-4A50-9BC1-53831B5C8002}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {794C4984-BB46-4A50-9BC1-53831B5C8002}.Debug|Any CPU.Build.0 = Debug|Any CPU + {794C4984-BB46-4A50-9BC1-53831B5C8002}.Release|Any CPU.ActiveCfg = Release|Any CPU + {794C4984-BB46-4A50-9BC1-53831B5C8002}.Release|Any CPU.Build.0 = Release|Any CPU + {F0A7B925-30F2-4FAA-97E6-7848B3E104B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F0A7B925-30F2-4FAA-97E6-7848B3E104B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0A7B925-30F2-4FAA-97E6-7848B3E104B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F0A7B925-30F2-4FAA-97E6-7848B3E104B6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorBindingsAttribute.cs b/NetFabric.Hyperlinq/Attributes/GeneratorBindingsAttribute.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorBindingsAttribute.cs rename to NetFabric.Hyperlinq/Attributes/GeneratorBindingsAttribute.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorIgnoreAttribute.cs b/NetFabric.Hyperlinq/Attributes/GeneratorIgnoreAttribute.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorIgnoreAttribute.cs rename to NetFabric.Hyperlinq/Attributes/GeneratorIgnoreAttribute.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorMappingAttribute.cs b/NetFabric.Hyperlinq/Attributes/GeneratorMappingAttribute.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Attributes/GeneratorMappingAttribute.cs rename to NetFabric.Hyperlinq/Attributes/GeneratorMappingAttribute.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/CompilationContext.cs b/NetFabric.Hyperlinq/CompilationContext.cs similarity index 98% rename from NetFabric.Hyperlinq.SourceGenerator/CompilationContext.cs rename to NetFabric.Hyperlinq/CompilationContext.cs index 7dedf96f5..a2a169618 100644 --- a/NetFabric.Hyperlinq.SourceGenerator/CompilationContext.cs +++ b/NetFabric.Hyperlinq/CompilationContext.cs @@ -1,4 +1,5 @@ using Microsoft.CodeAnalysis; +using NetFabric.CodeAnalysis; using System; namespace NetFabric.Hyperlinq.SourceGenerator diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.cs deleted file mode 100644 index b9af7e02e..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.Enumerable.cs +++ /dev/null @@ -1,155 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class EnumerableExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this IEnumerable source) - => new(source); - - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ValueEnumerable - : IValueEnumerable> - { - readonly IEnumerable source; - - internal ValueEnumerable(IEnumerable source) - => this.source = source; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerator GetEnumerator() - => new(source.GetEnumerator()); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IEnumerable AsEnumerable() - => source; - - public TSource[] ToArray() - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(collection.Count); - collection.CopyTo(result, 0); - return result; - } - - using var arrayBuilder = ValueEnumerableExtensions.ToArrayBuilder, ValueEnumerator, TSource>(this, ArrayPool.Shared, false); - return arrayBuilder.ToArray(); - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(collection.Count, clearOnDispose); - collection.CopyTo(result.Rented, 0); - return result; - } - - using var arrayBuilder = ValueEnumerableExtensions.ToArrayBuilder, ValueEnumerator, TSource>(this, pool, clearOnDispose); - return arrayBuilder.ToArray(pool, clearOnDispose); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public bool Contains(TSource value, IEqualityComparer? comparer = default) - { - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return this.Contains, ValueEnumerator, TSource>(value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, int, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, int?, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, nint, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, nint?, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, nuint, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, nuint?, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, long, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, long?, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, float, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, float?, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, double, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, double?, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, decimal, decimal>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - => source.Sum, ValueEnumerator, decimal?, decimal>(); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.cs deleted file mode 100644 index a8be25625..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyCollection.cs +++ /dev/null @@ -1,214 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ReadOnlyCollectionExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this IReadOnlyCollection source) - => new(source); - - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ValueEnumerable - : IValueReadOnlyCollection> - , ICollection - { - readonly IReadOnlyCollection source; - - internal ValueEnumerable(IReadOnlyCollection source) - => this.source = source; - - public int Count - => source.Count; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerator GetEnumerator() - => new(source.GetEnumerator()); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - - bool ICollection.IsReadOnly - => true; - - public void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = GetEnumerator(); - if (arrayIndex is 0 && array.Length == Count) // to enable range check elimination - { - for (var index = 0; index < array.Length; index++) - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - bool ICollection.Contains(TSource item) - => Contains(item, default); - - [ExcludeFromCodeCoverage] - void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IReadOnlyCollection AsEnumerable() - => source; - - public TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - #region Quantifier - - public bool Contains(TSource value, IEqualityComparer? comparer = default) - => Count is not 0 && source.Contains(value, comparer); - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyList.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyList.cs deleted file mode 100644 index c6646af20..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ReadOnlyList.cs +++ /dev/null @@ -1,320 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ReadOnlyListExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, TSource> AsValueEnumerable(this IReadOnlyList source) - => new(source); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TList source) - where TList : IReadOnlyList - => new(source); - - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ValueEnumerable - : IValueReadOnlyList> - , IList - where TList : IReadOnlyList - { - readonly TList source; - - internal ValueEnumerable(TList source) - => this.source = source; - - public TSource this[int index] - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => source[index]; - } - - TSource IList.this[int index] - { - get => source[index]; - [DoesNotReturn] - // ReSharper disable once ValueParameterNotUsed - set => Throw.NotSupportedException(); - } - - public int Count - => source.Count; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerator GetEnumerator() - => new(source.GetEnumerator()); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - - bool ICollection.IsReadOnly - => true; - - public void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = GetEnumerator(); - if (arrayIndex is 0 && array.Length == Count) // to enable range check elimination - { - for (var index = 0; index < array.Length; index++) - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - bool ICollection.Contains(TSource item) - => Contains(item, default); - - public int IndexOf(TSource item) - { - return source switch - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - IList list => list.IndexOf(item), - - _ => IndexOfEnumerable(this, item), - }; - - static int IndexOfEnumerable(ValueEnumerable source, TSource item) - { - using var enumerator = source.GetEnumerator(); - for (var index = 0; enumerator.MoveNext(); index++) - { - if (EqualityComparer.Default.Equals(enumerator.Current, item)) - return index; - } - return -1; - } - } - - [ExcludeFromCodeCoverage] - void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - [ExcludeFromCodeCoverage] - void IList.Insert(int index, TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - void IList.RemoveAt(int index) - => Throw.NotSupportedException(); - - #region Partitioning - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SkipTakeEnumerable, TSource> Skip(int count) - => this.Skip, TSource>(count); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SkipTakeEnumerable, TSource> Take(int count) - => this.Take, TSource>(count); - - #endregion - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IReadOnlyCollection AsEnumerable() - // ReSharper disable once HeapView.PossibleBoxingAllocation - => source; - - public TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - - #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.SelectEnumerable, ValueEnumerator, TSource, TResult, FunctionWrapper> Select(Func selector) - => ValueReadOnlyListExtensions.Select, ValueEnumerator, TSource, TResult>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.SelectEnumerable, ValueEnumerator, TSource, TResult, TSelector> Select(TSelector selector = default) - where TSelector : struct, IFunction - => ValueReadOnlyListExtensions.Select, ValueEnumerator, TSource, TResult, TSelector>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.SelectAtEnumerable, ValueEnumerator, TSource, TResult, FunctionWrapper> Select(Func selector) - => ValueReadOnlyListExtensions.Select, ValueEnumerator, TSource, TResult>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueReadOnlyListExtensions.SelectAtEnumerable, ValueEnumerator, TSource, TResult, TSelector> SelectAt(TSelector selector = default) - where TSelector : struct, IFunction - => ValueReadOnlyListExtensions.SelectAt, ValueEnumerator, TSource, TResult, TSelector>(this, selector); - - #endregion - - #region Quantifier - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Contains(TSource value, IEqualityComparer? comparer = default) - => Count is not 0 && source.Contains(value); - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - where TList : IReadOnlyList - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TList : IReadOnlyList - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TList : IReadOnlyList - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TList : IReadOnlyList - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TList : IReadOnlyList - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TList : IReadOnlyList - => ValueReadOnlyCollectionExtensions.Sum, ValueEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.cs deleted file mode 100644 index ac02b2263..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueEnumerable.cs +++ /dev/null @@ -1,174 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this IValueEnumerable source) - where TEnumerator : struct, IEnumerator - => new(source); - - [GeneratorBindings(source: "source", sourceImplements: "IValueEnumerable`2", enumerableType: "IValueEnumerable")] - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ValueEnumerable - : IValueEnumerable - where TEnumerator : struct, IEnumerator - { - readonly IValueEnumerable source; - - internal ValueEnumerable(IValueEnumerable source) - => this.source = source; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public TEnumerator GetEnumerator() - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IEnumerable AsEnumerable() - => source; - - public TSource[] ToArray() - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(collection.Count); - collection.CopyTo(result, 0); - return result; - } - - using var arrayBuilder = ToArrayBuilder, TEnumerator, TSource>(source, ArrayPool.Shared, false); - return arrayBuilder.ToArray(); - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(collection.Count, clearOnDispose); - collection.CopyTo(result.Rented, 0); - return result; - } - - using var arrayBuilder = ToArrayBuilder, TEnumerator, TSource>(source, pool, clearOnDispose); - return arrayBuilder.ToArray(pool, clearOnDispose); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public bool Contains(TSource value, IEqualityComparer? comparer = default) - { - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return source.Contains, TEnumerator, TSource>(value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, int, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, int?, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, nint, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, nint?, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, nuint, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, nuint?, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, long, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, long?, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, float, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, float?, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, double, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, double?, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, decimal, decimal>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Sum, TEnumerator, decimal?, decimal>(); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.cs deleted file mode 100644 index e3eb7ce64..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'1.ValueReadOnlyCollection.cs +++ /dev/null @@ -1,246 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueReadOnlyCollectionExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this IValueReadOnlyCollection source) - where TEnumerator : struct, IEnumerator - => new(source); - - [GeneratorBindings(source: "source", sourceImplements: "IValueReadOnlyCollection`2,IValueEnumerable`2", enumerableType: "IValueReadOnlyCollection")] - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ValueEnumerable - : IValueReadOnlyCollection - , ICollection - where TEnumerator : struct, IEnumerator - { - readonly IValueReadOnlyCollection source; - - internal ValueEnumerable(IValueReadOnlyCollection source) - => this.source = source; - - public int Count - => source.Count; - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public TEnumerator GetEnumerator() - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - - bool ICollection.IsReadOnly - => true; - - public void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = GetEnumerator(); - if (arrayIndex is 0 && array.Length == Count) // to enable range check elimination - { - for (var index = 0; index < array.Length; index++) - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - bool ICollection.Contains(TSource item) - => Contains(item, default); - - [ExcludeFromCodeCoverage] - void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public IReadOnlyCollection AsEnumerable() - => source; - - public TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public bool Contains(TSource value, IEqualityComparer? comparer = default) - { - if (Count is 0) - return false; - - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return source.Contains, TEnumerator, TSource>(value, comparer); - } - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerator : struct, IEnumerator - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerator : struct, IEnumerator - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerator : struct, IEnumerator - => Sum, TEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.cs deleted file mode 100644 index f735067c5..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.Enumerable.cs +++ /dev/null @@ -1,264 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class EnumerableExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - => AsValueEnumerable>(source, new FunctionWrapper(getEnumerator)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TGetEnumerator : struct, IFunction - => new(source, getEnumerator, getEnumerator); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator, Func getEnumerator2) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - => AsValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getEnumerator), new FunctionWrapper(getEnumerator2)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default, TGetEnumerator2 getEnumerator2 = default) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => new(source, getEnumerator, getEnumerator2); - - [StructLayout(LayoutKind.Auto)] - public partial struct ValueEnumerable - : IValueEnumerable - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - { - readonly TEnumerable source; - TGetEnumerator getEnumerator; - TGetEnumerator2 getEnumerator2; - - internal ValueEnumerable(TEnumerable source, TGetEnumerator getEnumerator, TGetEnumerator2 getEnumerator2) - => (this.source, this.getEnumerator, this.getEnumerator2) = (source, getEnumerator, getEnumerator2); - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerator2 GetEnumerator() - => getEnumerator2.Invoke(source); - readonly TEnumerator IValueEnumerable.GetEnumerator() - => getEnumerator.Invoke(source); - readonly IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - readonly IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerable AsEnumerable() - => source; - - public readonly TSource[] ToArray() - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(collection.Count); - collection.CopyTo(result, 0); - return result; - } - - using var arrayBuilder = ValueEnumerableExtensions.ToArrayBuilder, TEnumerator, TSource>(this, ArrayPool.Shared, false); - return arrayBuilder.ToArray(); - } - - public readonly Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(collection.Count, clearOnDispose); - collection.CopyTo(result.Rented, 0); - return result; - } - - using var arrayBuilder = ValueEnumerableExtensions.ToArrayBuilder, TEnumerator, TSource>(this, pool, clearOnDispose); - return arrayBuilder.ToArray(pool, clearOnDispose); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public bool Contains(TSource value, IEqualityComparer? comparer = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return this.Contains, TEnumerator, TSource>(value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, int, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, int?, int>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, nint, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, nint?, nint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, nuint, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, nuint?, nuint>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, long, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, long?, long>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, float, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, float?, float>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, double, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, double?, double>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, decimal, decimal>(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Sum, TEnumerator, decimal?, decimal>(); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.cs deleted file mode 100644 index d3ca7a55c..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ReadOnlyCollection.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ReadOnlyCollectionExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - => AsValueEnumerable>(source, new FunctionWrapper(getEnumerator)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TGetEnumerator : struct, IFunction - => new(source, getEnumerator, getEnumerator); - - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator, Func getEnumerator2) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - => AsValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getEnumerator), new FunctionWrapper(getEnumerator2)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default, TGetEnumerator2 getEnumerator2 = default) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => new(source, getEnumerator, getEnumerator2); - - [StructLayout(LayoutKind.Auto)] - public partial struct ValueEnumerable - : IValueReadOnlyCollection - , ICollection - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - { - readonly TEnumerable source; -#pragma warning disable IDE0044 // Add readonly modifier - TGetEnumerator getEnumerator; - TGetEnumerator2 getEnumerator2; -#pragma warning restore IDE0044 // Add readonly modifier - - internal ValueEnumerable(TEnumerable source, TGetEnumerator getEnumerator, TGetEnumerator2 getEnumerator2) - => (this.source, this.getEnumerator, this.getEnumerator2) = (source, getEnumerator, getEnumerator2); - - public readonly int Count - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerator2 GetEnumerator() - => getEnumerator2.Invoke(source); - readonly TEnumerator IValueEnumerable.GetEnumerator() - => getEnumerator.Invoke(source); - readonly IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - readonly IEnumerator IEnumerable.GetEnumerator() - => source.GetEnumerator(); - - bool ICollection.IsReadOnly - => true; - - public readonly void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = getEnumerator.Invoke(source); - if (arrayIndex is 0 && array.Length == Count) // to enable range check elimination - { - for (var index = 0; index < array.Length; index++) - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - readonly bool ICollection.Contains(TSource item) - => Contains(item, default); - - [ExcludeFromCodeCoverage] - readonly void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerable AsEnumerable() - => source; - - public readonly TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public readonly Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly List ToList() - => ToArray().AsList(); - - #endregion - #region Quantifier - - public readonly bool Contains(TSource value, IEqualityComparer? comparer = default) - => Count is not 0 && source.Contains(value, comparer); - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.cs deleted file mode 100644 index a3d066e5e..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueEnumerable.cs +++ /dev/null @@ -1,266 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueEnumerableExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - => AsValueEnumerable>(source, new FunctionWrapper(getEnumerator)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TGetEnumerator : struct, IFunction - => new(source, getEnumerator, getEnumerator); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator, Func getEnumerator2) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - => AsValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getEnumerator), new FunctionWrapper(getEnumerator2)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default, TGetEnumerator2 getEnumerator2 = default) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => new(source, getEnumerator, getEnumerator2); - - [GeneratorBindings(source: "source", sourceImplements: "IValueEnumerable`2")] - [StructLayout(LayoutKind.Auto)] - public partial struct ValueEnumerable - : IValueEnumerable - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - { - internal readonly TEnumerable source; - internal TGetEnumerator getEnumerator; - internal TGetEnumerator2 getEnumerator2; - - internal ValueEnumerable(TEnumerable source, TGetEnumerator getEnumerator, TGetEnumerator2 getEnumerator2) - => (this.source, this.getEnumerator, this.getEnumerator2) = (source, getEnumerator, getEnumerator2); - - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerator2 GetEnumerator() - => getEnumerator2.Invoke(source); - readonly TEnumerator IValueEnumerable.GetEnumerator() - => getEnumerator.Invoke(source); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.PossibleBoxingAllocation - => source.GetEnumerator(); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.PossibleBoxingAllocation - => source.GetEnumerator(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerable AsEnumerable() - => source; - - public TSource[] ToArray() - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(collection.Count); - collection.CopyTo(result, 0); - return result; - } - - using var arrayBuilder = ToArrayBuilder(source, ArrayPool.Shared, false); - return arrayBuilder.ToArray(); - } - - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - if (collection.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(collection.Count, clearOnDispose); - collection.CopyTo(result.Rented, 0); - return result; - } - - using var arrayBuilder = ToArrayBuilder(source, pool, clearOnDispose); - return arrayBuilder.ToArray(pool, clearOnDispose); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public readonly bool Contains(TSource value, IEqualityComparer? comparer = default) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return source.Contains(value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueEnumerable - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.source.Sum(); - } -} diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.cs deleted file mode 100644 index b5c96d2b9..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyCollection.cs +++ /dev/null @@ -1,361 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueReadOnlyCollectionExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => AsValueEnumerable>(source, new FunctionWrapper(getEnumerator)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TGetEnumerator : struct, IFunction - => new(source, getEnumerator, getEnumerator); - - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator, Func getEnumerator2) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - => AsValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getEnumerator), new FunctionWrapper(getEnumerator2)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default, TGetEnumerator2 getEnumerator2 = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => new(source, getEnumerator, getEnumerator2); - - [GeneratorBindings(source: "source", sourceImplements: "IValueReadOnlyCollection`2,IValueEnumerable`2")] - [StructLayout(LayoutKind.Auto)] - public partial struct ValueEnumerable - : IValueReadOnlyCollection - , ICollection - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - { - readonly TEnumerable source; -#pragma warning disable IDE0044 // Add readonly modifier - TGetEnumerator getEnumerator; - TGetEnumerator2 getEnumerator2; -#pragma warning restore IDE0044 // Add readonly modifier - - internal ValueEnumerable(TEnumerable source, TGetEnumerator getEnumerator, TGetEnumerator2 getEnumerator2) - => (this.source, this.getEnumerator, this.getEnumerator2) = (source, getEnumerator, getEnumerator2); - - public readonly int Count - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerator2 GetEnumerator() - => getEnumerator2.Invoke(source); - readonly TEnumerator IValueEnumerable.GetEnumerator() - => getEnumerator.Invoke(source); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - - readonly bool ICollection.IsReadOnly - => true; - - public readonly void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = getEnumerator.Invoke(source); - if (arrayIndex is 0 && array.Length == Count) - { - for (var index = 0; index < array.Length; index++) // to enable range check elimination - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - readonly bool ICollection.Contains(TSource item) - => Contains(item, default); - - [ExcludeFromCodeCoverage] - readonly void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerable AsEnumerable() - => source; - - public readonly TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public readonly Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly List ToList() - => ToArray().AsList(); - - #endregion - - #region Quantifier - - public readonly bool Contains(TSource value, IEqualityComparer? comparer = default) - { - if (Count is 0) - return false; - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return ValueReadOnlyCollectionExtensions.Contains(source, value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => Sum, TEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.cs deleted file mode 100644 index 50a3711f8..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable'6.ValueReadOnlyList.cs +++ /dev/null @@ -1,428 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueReadOnlyListExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - => AsValueEnumerable>(source, new FunctionWrapper(getEnumerator)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TGetEnumerator : struct, IFunction - => new(source, getEnumerator, getEnumerator); - - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable, FunctionWrapper> AsValueEnumerable(this TEnumerable source, Func getEnumerator, Func getEnumerator2) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - => AsValueEnumerable, FunctionWrapper>(source, new FunctionWrapper(getEnumerator), new FunctionWrapper(getEnumerator2)); - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ValueEnumerable AsValueEnumerable(this TEnumerable source, TGetEnumerator getEnumerator = default, TGetEnumerator2 getEnumerator2 = default) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => new(source, getEnumerator, getEnumerator2); - - [GeneratorBindings(source: "source", sourceImplements: "IValueReadOnlyList`2,IValueEnumerable`2")] - [StructLayout(LayoutKind.Auto)] - public partial struct ValueEnumerable - : IValueReadOnlyList - , IList - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - { - readonly TEnumerable source; -#pragma warning disable IDE0044 // Add readonly modifier - TGetEnumerator getEnumerator; - TGetEnumerator2 getEnumerator2; -#pragma warning restore IDE0044 // Add readonly modifier - - internal ValueEnumerable(TEnumerable source, TGetEnumerator getEnumerator, TGetEnumerator2 getEnumerator2) - => (this.source, this.getEnumerator, this.getEnumerator2) = (source, getEnumerator, getEnumerator2); - - public readonly TSource this[int index] - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => source[index]; - } - readonly TSource IList.this[int index] - { - get => source[index]; - set => Throw.NotSupportedException(); - } - - public readonly int Count - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerator2 GetEnumerator() - => getEnumerator2.Invoke(source); - readonly TEnumerator IValueEnumerable.GetEnumerator() - => getEnumerator.Invoke(source); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - readonly IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => source.GetEnumerator(); - - readonly bool ICollection.IsReadOnly - => true; - - public readonly void CopyTo(TSource[] array, int arrayIndex) - { - if (Count is 0) - return; - - if (array.Length - arrayIndex < Count) - Throw.ArgumentException(Resource.DestinationNotLongEnough, nameof(array)); - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is ICollection collection) - { - collection.CopyTo(array, arrayIndex); - } - else - { - using var enumerator = getEnumerator.Invoke(source); - if (arrayIndex is 0 && array.Length == Count) // to enable range check elimination - { - for (var index = 0; index < array.Length; index++) - { - _ = enumerator.MoveNext(); - array[index] = enumerator.Current; - } - } - else - { - checked - { - for (var index = arrayIndex; enumerator.MoveNext(); index++) - array[index] = enumerator.Current; - } - } - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - readonly bool ICollection.Contains(TSource item) - => Contains(item, default); - - public readonly int IndexOf(TSource item) - { - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (source is IList list) - return list.IndexOf(item); - - using var enumerator = getEnumerator.Invoke(source); - for (var index = 0; enumerator.MoveNext(); index++) - { - if (EqualityComparer.Default.Equals(enumerator.Current, item)) - return index; - } - return -1; - } - - [ExcludeFromCodeCoverage] - readonly void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly void ICollection.Clear() - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - - [ExcludeFromCodeCoverage] - readonly void IList.Insert(int index, TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - readonly void IList.RemoveAt(int index) - => Throw.NotSupportedException(); - - #region Partitioning - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ReadOnlyListExtensions.SkipTakeEnumerable, TSource> Skip(int count) - => this.Skip, TSource>(count); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ReadOnlyListExtensions.SkipTakeEnumerable, TSource> Take(int count) - => this.Take, TSource>(count); - - #endregion - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly TEnumerable AsEnumerable() - => source; - - public readonly TSource[] ToArray() - { - if (source.Count is 0) - return Array.Empty(); - - var result = Utils.AllocateUninitializedArray(source.Count); - CopyTo(result, 0); - return result; - } - - public readonly Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - { - if (source.Count is 0) - return Lease.Empty(); - - var result = pool.Lease(source.Count, clearOnDispose); - CopyTo(result.Rented, 0); - return result; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly List ToList() - => ToArray().AsList(); - - #endregion - - #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectEnumerable, TEnumerator, TSource, TResult, FunctionWrapper> Select(Func selector) - => Select, TEnumerator, TSource, TResult>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectEnumerable, TEnumerator, TSource, TResult, TSelector> Select(TSelector selector = default) - where TSelector : struct, IFunction - => Select, TEnumerator, TSource, TResult, TSelector>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectAtEnumerable, TEnumerator, TSource, TResult, FunctionWrapper> Select(Func selector) - => Select, TEnumerator, TSource, TResult>(this, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly SelectAtEnumerable, TEnumerator, TSource, TResult, TSelector> SelectAt(TSelector selector = default) - where TSelector : struct, IFunction - => SelectAt, TEnumerator, TSource, TResult, TSelector>(this, selector); - - #endregion - - #region Quantifier - - public readonly bool Contains(TSource value, IEqualityComparer? comparer = default) - { - if (Count is 0) - return false; - - // ReSharper disable once HeapView.PossibleBoxingAllocation - if (comparer.UseDefaultComparer() && source is ICollection collection) - return collection.Contains(value); - - return ValueReadOnlyCollectionExtensions.Contains(source, value, comparer); - } - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ValueEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ValueEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, int, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, int?, int>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nint, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nint?, nint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nuint, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, nuint?, nuint>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, long, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, long?, long>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, float, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, float?, float>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, double, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, double?, double>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, decimal, decimal>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ValueEnumerable source) - where TEnumerable : IValueReadOnlyList - where TEnumerator : struct, IEnumerator - where TEnumerator2 : struct - where TGetEnumerator : struct, IFunction - where TGetEnumerator2 : struct, IFunction - => ValueReadOnlyCollectionExtensions.Sum, TEnumerator, decimal?, decimal>(source); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs deleted file mode 100644 index fadda85ae..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/AsValueEnumerable.ArraySegment.cs +++ /dev/null @@ -1,459 +0,0 @@ -using System; -using System.Buffers; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; -using System.Numerics; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ArrayExtensions - { - - [GeneratorIgnore] - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ArraySegmentValueEnumerable AsValueEnumerable(this ArraySegment source) - => new(source); - - [GeneratorBindings(source: "((ReadOnlySpan)source.AsSpan())", sourceImplements: "ReadOnlySpan`1")] - [StructLayout(LayoutKind.Auto)] - public readonly partial struct ArraySegmentValueEnumerable - : IValueReadOnlyList.DisposableEnumerator> - , IList - { - internal readonly ArraySegment source; - - internal ArraySegmentValueEnumerable(ArraySegment source) - => this.source = source; - - public int Count - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => source.Count; - } - - public TSource this[int index] - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - ThrowIfArgument.OutOfRange(index, Count, nameof(index)); - return source.Array![source.Offset + index]; - } - } - - TSource IList.this[int index] - { - get => this[index]; - - [ExcludeFromCodeCoverage] - // ReSharper disable once ValueParameterNotUsed - set => Throw.NotSupportedException(); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SpanEnumerator GetEnumerator() - => new(source); - - DisposableEnumerator IValueEnumerable.GetEnumerator() - => new(source); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(source); - - IEnumerator IEnumerable.GetEnumerator() - // ReSharper disable once HeapView.BoxingAllocation - => new DisposableEnumerator(source); - - - bool ICollection.IsReadOnly - => true; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void CopyTo(TSource[] array, int arrayIndex) - => source.AsSpan().CopyTo(array.AsSpan(arrayIndex)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Contains(TSource item) - => source.Contains(item); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public int IndexOf(TSource item) - { - var index = Array.IndexOf(source.Array!, item, source.Offset, source.Count); - return index < 0 - ? -1 - : index - source.Offset; - } - - [ExcludeFromCodeCoverage] - void ICollection.Add(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - bool ICollection.Remove(TSource item) - => Throw.NotSupportedException(); - [ExcludeFromCodeCoverage] - void ICollection.Clear() - => Throw.NotSupportedException(); - - [ExcludeFromCodeCoverage] - void IList.Insert(int index, TSource item) - => Throw.NotSupportedException(); - - [ExcludeFromCodeCoverage] - void IList.RemoveAt(int index) - => Throw.NotSupportedException(); - - [StructLayout(LayoutKind.Auto)] - public struct DisposableEnumerator - : IEnumerator - { - readonly ArraySegment source; - int index; - - internal DisposableEnumerator(ArraySegment source) - { - this.source = source; - index = -1; - } - - public readonly TSource Current - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => source.Array![source.Offset + index]; - } - readonly object? IEnumerator.Current - // ReSharper disable once HeapView.PossibleBoxingAllocation - => Current; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool MoveNext() - { - if (index < source.Count) - { - index++; - return index < source.Count; - } - return false; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [ExcludeFromCodeCoverage] - public void Reset() - => index = -1; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly void Dispose() { } - } - - #region Aggregation - - #endregion - - #region Conversion - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentValueEnumerable AsValueEnumerable() - => this; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegment AsEnumerable() - => source; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public TSource[] ToArray() - => source.AsSpan().ToArray(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Lease ToArray(ArrayPool pool, bool clearOnDispose = default) - => source.AsSpan().ToArray(pool, clearOnDispose); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public List ToList() - => ((ReadOnlySpan)source.AsSpan()).ToList(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, comparer); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(TKeySelector keySelector, IEqualityComparer? comparer = default) - where TKey : notnull - where TKeySelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, comparer); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(Func keySelector, Func elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, elementSelector, comparer); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary ToDictionary(TKeySelector keySelector, TElementSelector elementSelector, IEqualityComparer? comparer = default) - where TKey : notnull - where TKeySelector : struct, IFunction - where TElementSelector : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).ToDictionary(keySelector, elementSelector, comparer); - - #endregion - - #region Element - - public Option ElementAt(int index) - => index < 0 || index >= source.Count - ? Option.None - : Option.Some(source.Array![source.Offset + index]); - - public Option First() - => source switch - { - { Count: 0 } => Option.None, - _ => Option.Some(source.Array![source.Offset]) - }; - - public Option Single() - => source switch - { - { Count: 1 } => Option.Some(source.Array![source.Offset]), - _ => Option.None, - }; - - #endregion - - #region Filtering - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentWhereEnumerable> Where(Func predicate) - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentWhereEnumerable Where(TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentWhereAtEnumerable> Where(Func predicate) - => source.Where(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentWhereAtEnumerable WhereAt(TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.WhereAt(predicate); - - #endregion - - #region Partitioning - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentValueEnumerable Skip(int count) - { - var (newOffset, newCount) = Utils.Skip(source.Count, count); - return new ArraySegmentValueEnumerable(new ArraySegment(source.Array!, source.Offset + newOffset, newCount)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentValueEnumerable Take(int count) - => new(new ArraySegment(source.Array!, source.Offset, Utils.Take(source.Count, count))); - - #endregion - - #region Projection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectEnumerable> Select(Func selector) - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectEnumerable Select(TSelector selector = default) - where TSelector : struct, IFunction - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectAtEnumerable> Select(Func selector) - => source.Select(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectAtEnumerable SelectAt(TSelector selector = default) - where TSelector : struct, IFunction - => source.SelectAt(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectManyEnumerable> SelectMany(Func selector) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - => source.SelectMany(selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentSelectManyEnumerable SelectMany(TSelector selector = default) - where TSubEnumerable : IValueEnumerable - where TSubEnumerator : struct, IEnumerator - where TSelector : struct, IFunction - => source.SelectMany(selector); - - #endregion - - #region Quantifier - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => All(new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(TPredicate predicate) - where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).All(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool All(Func predicate) - => AllAt(new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool AllAt(TPredicate predicate) - where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AllAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any() - => ((ReadOnlySpan)source.AsSpan()).Any(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => Any(new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(TPredicate predicate) - where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).Any(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Any(Func predicate) - => AnyAt(new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool AnyAt(TPredicate predicate) - where TPredicate : struct, IFunction - => ((ReadOnlySpan)source.AsSpan()).AnyAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Contains(TSource value, IEqualityComparer? comparer) - => ((ReadOnlySpan)source.AsSpan()).Contains(value, comparer); - - #endregion - - #region Set - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ArraySegmentDistinctEnumerable Distinct(IEqualityComparer? comparer = default) - => source.Distinct(comparer); - - #endregion - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentValueEnumerable source) - => source.Count; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Count(this ArraySegmentValueEnumerable source, Func predicate) - => source.Count(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int CountAt(this ArraySegmentValueEnumerable source, TPredicate predicate = default) - where TPredicate : struct, IFunction - => source.CountAt(predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nint Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static nuint Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static long Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).SumVector(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static double Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static decimal Sum(this ArraySegmentValueEnumerable source) - => ((ReadOnlySpan)source.source.AsSpan()).Sum(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool ContainsVector(this ArraySegmentValueEnumerable source, TSource value) - where TSource : struct - => ((ReadOnlySpan)source.source.AsSpan()).ContainsVector(value); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SpanSelectVectorContext, Vector>, FunctionWrapper> SelectVector(this ArraySegmentValueEnumerable source, Func, Vector> vectorSelector, Func selector) - where TSource : struct - where TResult : struct - => ((ReadOnlySpan)source.source.AsSpan()).SelectVector(vectorSelector, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SpanSelectVectorContext SelectVector(this ArraySegmentValueEnumerable source, TSelector selector = default) - where TSelector : struct, IFunction, Vector>, IFunction - where TSource : struct - where TResult : struct - => ((ReadOnlySpan)source.source.AsSpan()).SelectVector(selector, selector); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SpanSelectVectorContext SelectVector(this ArraySegmentValueEnumerable source, TVectorSelector vectorSelector = default, TSelector selector = default) - where TVectorSelector : struct, IFunction, Vector> - where TSelector : struct, IFunction - where TSource : struct - where TResult : struct - => ((ReadOnlySpan)source.source.AsSpan()).SelectVector(vectorSelector, selector); - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/DictionaryExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/DictionaryExtensions.cs deleted file mode 100644 index 404d18218..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/DictionaryExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class DictionaryExtensions - { - // Dictionary is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - // Same for Dictionary.KeyCollection and Dictionary.ValueCollection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, Dictionary.Enumerator, Dictionary.Enumerator, KeyValuePair, GetEnumerator, GetEnumerator> AsValueEnumerable(this Dictionary source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable, Dictionary.Enumerator, KeyValuePair, GetEnumerator>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable.KeyCollection, Dictionary.KeyCollection.Enumerator, Dictionary.KeyCollection.Enumerator, TKey, GetEnumerator, GetEnumerator> AsValueEnumerable(this Dictionary.KeyCollection source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable.KeyCollection, Dictionary.KeyCollection.Enumerator, TKey, GetEnumerator>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable.ValueCollection, Dictionary.ValueCollection.Enumerator, Dictionary.ValueCollection.Enumerator, TValue, GetEnumerator, GetEnumerator> AsValueEnumerable(this Dictionary.ValueCollection source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable.ValueCollection, Dictionary.ValueCollection.Enumerator, TValue, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, Dictionary.Enumerator> - , IFunction.KeyCollection, Dictionary.KeyCollection.Enumerator> - , IFunction.ValueCollection, Dictionary.ValueCollection.Enumerator> - where TKey : notnull - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary.Enumerator Invoke(Dictionary source) - => source.GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary.KeyCollection.Enumerator Invoke(Dictionary.KeyCollection source) - => source.GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Dictionary.ValueCollection.Enumerator Invoke(Dictionary.ValueCollection source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSetExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSetExtensions.cs deleted file mode 100644 index 369e75988..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/HashSetExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class HashSetExtensions - { - // HashSet is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, HashSet.Enumerator, HashSet.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this HashSet source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, HashSet.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, HashSet.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public HashSet.Enumerator Invoke(HashSet source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedListExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedListExtensions.cs deleted file mode 100644 index f14f1d7c7..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/LinkedListExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class LinkedListExtensions - { - // LinkedList is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, LinkedList.Enumerator, LinkedList.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this LinkedList source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, LinkedList.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, LinkedList.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public LinkedList.Enumerator Invoke(LinkedList source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueueExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueueExtensions.cs deleted file mode 100644 index 292eeb24d..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/PriorityQueueExtensions.cs +++ /dev/null @@ -1,29 +0,0 @@ -#if NET6_0_OR_GREATER - -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - - public static class PriorityQueueExtensions - { - // PriorityQueue.UnorderedItemsCollection is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable.UnorderedItemsCollection, PriorityQueue.UnorderedItemsCollection.Enumerator, PriorityQueue.UnorderedItemsCollection.Enumerator, (TElement Element, TPriority Priority), GetEnumerator, GetEnumerator> AsValueEnumerable(this PriorityQueue.UnorderedItemsCollection source) - => ReadOnlyCollectionExtensions.AsValueEnumerable.UnorderedItemsCollection, PriorityQueue.UnorderedItemsCollection.Enumerator, (TElement Element, TPriority Priority), GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction.UnorderedItemsCollection, PriorityQueue.UnorderedItemsCollection.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public PriorityQueue.UnorderedItemsCollection.Enumerator Invoke(PriorityQueue.UnorderedItemsCollection source) - => source.GetEnumerator(); - } - } -} - -#endif \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/QueueExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/QueueExtensions.cs deleted file mode 100644 index 6080caba0..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/QueueExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class QueueExtensions - { - // Queue is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, Queue.Enumerator, Queue.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this Queue source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, Queue.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, Queue.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Queue.Enumerator Invoke(Queue source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionaryExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionaryExtensions.cs deleted file mode 100644 index ef820ddcc..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedDictionaryExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class SortedDictionaryExtensions - { - // SortedDictionary is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - // Same for SortedDictionary.KeyCollection and SortedDictionary.ValueCollection - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, SortedDictionary.Enumerator, SortedDictionary.Enumerator, KeyValuePair, GetEnumerator, GetEnumerator> AsValueEnumerable(this SortedDictionary source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable, SortedDictionary.Enumerator, KeyValuePair, GetEnumerator>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable.KeyCollection, SortedDictionary.KeyCollection.Enumerator, SortedDictionary.KeyCollection.Enumerator, TKey, GetEnumerator, GetEnumerator> AsValueEnumerable(this SortedDictionary.KeyCollection source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable.KeyCollection, SortedDictionary.KeyCollection.Enumerator, TKey, GetEnumerator>(source); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable.ValueCollection, SortedDictionary.ValueCollection.Enumerator, SortedDictionary.ValueCollection.Enumerator, TValue, GetEnumerator, GetEnumerator> AsValueEnumerable(this SortedDictionary.ValueCollection source) - where TKey : notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable.ValueCollection, SortedDictionary.ValueCollection.Enumerator, TValue, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, SortedDictionary.Enumerator> - , IFunction.KeyCollection, SortedDictionary.KeyCollection.Enumerator> - , IFunction.ValueCollection, SortedDictionary.ValueCollection.Enumerator> - where TKey : notnull - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SortedDictionary.Enumerator Invoke(SortedDictionary source) - => source.GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SortedDictionary.KeyCollection.Enumerator Invoke(SortedDictionary.KeyCollection source) - => source.GetEnumerator(); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SortedDictionary.ValueCollection.Enumerator Invoke(SortedDictionary.ValueCollection source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSetExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSetExtensions.cs deleted file mode 100644 index c5cedc01b..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/SortedSetExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class SortedSetExtensions - { - // SortedSet is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, SortedSet.Enumerator, SortedSet.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this SortedSet source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, SortedSet.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, SortedSet.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SortedSet.Enumerator Invoke(SortedSet source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/StackExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/StackExtensions.cs deleted file mode 100644 index ad56d19c5..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Generic/StackExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class StackExtensions - { - // Stack is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, Stack.Enumerator, Stack.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this Stack source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, Stack.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, Stack.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public Stack.Enumerator Invoke(Stack source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionaryExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionaryExtensions.cs deleted file mode 100644 index 2a51d9fa9..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableDictionaryExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableDictionaryExtensions - { - // ImmutableDictionary is reference-type that implements IReadOnlyCollection> and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, ImmutableDictionary.Enumerator, ImmutableDictionary.Enumerator, KeyValuePair, GetEnumerator, GetEnumerator> AsValueEnumerable(this ImmutableDictionary source) - where TKey: notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable, ImmutableDictionary.Enumerator, KeyValuePair, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ImmutableDictionary.Enumerator> - where TKey: notnull - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableDictionary.Enumerator Invoke(ImmutableDictionary source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSetExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSetExtensions.cs deleted file mode 100644 index 7f899c11c..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableHashSetExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableHashSetExtensions - { - // ImmutableHashSet is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, ImmutableHashSet.Enumerator, ImmutableHashSet.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this ImmutableHashSet source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, ImmutableHashSet.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ImmutableHashSet.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableHashSet.Enumerator Invoke(ImmutableHashSet source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableListExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableListExtensions.cs deleted file mode 100644 index f759387ca..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableListExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableListExtensions - { - // ImmutableList is reference-type that implements IReadOnlyCollection and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, ImmutableList.Enumerator, ImmutableList.Enumerator, TSource, GetEnumerator, GetEnumerator> AsValueEnumerable(this ImmutableList source) - => ReadOnlyCollectionExtensions.AsValueEnumerable, ImmutableList.Enumerator, TSource, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ImmutableList.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableList.Enumerator Invoke(ImmutableList source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueueExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueueExtensions.cs deleted file mode 100644 index e58289c03..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableQueueExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableQueueExtensions - { - // ImmutableQueue is reference-type that implements IEnumerable and has two enumerators: - // One that is a value-type and doesn't implement interfaces. - // Another that is a reference-type and implements IEnumerator. - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static EnumerableExtensions.ValueEnumerable, ValueEnumerator, ImmutableQueue.Enumerator, TSource, GetEnumerator, GetEnumerator2> AsValueEnumerable(this ImmutableQueue source) - => source.AsValueEnumerable, ValueEnumerator, ImmutableQueue.Enumerator, TSource, GetEnumerator, GetEnumerator2>(); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ValueEnumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerator Invoke(ImmutableQueue source) - => new(((IEnumerable)source).GetEnumerator()); - } - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator2 - : IFunction, ImmutableQueue.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableQueue.Enumerator Invoke(ImmutableQueue source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionaryExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionaryExtensions.cs deleted file mode 100644 index c336609af..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableSortedDictionaryExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableSortedDictionaryExtensions - { - // ImmutableSortedDictionary is reference-type that implements IReadOnlyCollection> and has a value-type enumerator that implements IEnumerator - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static ReadOnlyCollectionExtensions.ValueEnumerable, ImmutableSortedDictionary.Enumerator, ImmutableSortedDictionary.Enumerator, KeyValuePair, GetEnumerator, GetEnumerator> AsValueEnumerable(this ImmutableSortedDictionary source) - where TKey: notnull - => ReadOnlyCollectionExtensions.AsValueEnumerable, ImmutableSortedDictionary.Enumerator, KeyValuePair, GetEnumerator>(source); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ImmutableSortedDictionary.Enumerator> - where TKey: notnull - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableSortedDictionary.Enumerator Invoke(ImmutableSortedDictionary source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStackExtensions.cs b/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStackExtensions.cs deleted file mode 100644 index a153a1d07..000000000 --- a/NetFabric.Hyperlinq/Conversion/AsValueEnumerable/Bindings/System/Collections/Immutable/ImmutableStackExtensions.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using System.Collections.Immutable; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace NetFabric.Hyperlinq -{ - public static class ImmutableStackExtensions - { - // ImmutableStack is reference-type that implements IEnumerable and has two enumerators: - // One that is a value-type and doesn't implement interfaces. - // Another that is a reference-type and implements IEnumerator. - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static EnumerableExtensions.ValueEnumerable, ValueEnumerator, ImmutableStack.Enumerator, TSource, GetEnumerator, GetEnumerator2> AsValueEnumerable(this ImmutableStack source) - => source.AsValueEnumerable, ValueEnumerator, ImmutableStack.Enumerator, TSource, GetEnumerator, GetEnumerator2>(); - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator - : IFunction, ValueEnumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ValueEnumerator Invoke(ImmutableStack source) - => new(((IEnumerable)source).GetEnumerator()); - } - - [StructLayout(LayoutKind.Auto)] - public readonly struct GetEnumerator2 - : IFunction, ImmutableStack.Enumerator> - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public ImmutableStack.Enumerator Invoke(ImmutableStack source) - => source.GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Memory.cs b/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Memory.cs deleted file mode 100644 index 0fbef647e..000000000 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Memory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Buffers; -using System.Numerics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - static partial class ArrayExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Lease ToArray(this Memory source, ArrayPool pool, bool clearOnDispose = default) - => ((ReadOnlyMemory)source).Span.ToArray(pool, clearOnDispose); - } -} - diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlyMemory.cs b/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlyMemory.cs deleted file mode 100644 index 5b33812c9..000000000 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.ReadOnlyMemory.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Buffers; -using System.Numerics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - static partial class ArrayExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Lease ToArray(this ReadOnlyMemory source, ArrayPool pool, bool clearOnDispose = default) - => source.Span.ToArray(pool, clearOnDispose); - } -} - diff --git a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Span.cs b/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Span.cs deleted file mode 100644 index 204ed3e92..000000000 --- a/NetFabric.Hyperlinq/Conversion/ToArray/ToArray.Span.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Buffers; -using System.Numerics; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - static partial class ArrayExtensions - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Lease ToArray(this Span source, ArrayPool pool, bool clearOnDispose = default) - => ((ReadOnlySpan)source).ToArray(pool, clearOnDispose); - } -} - diff --git a/NetFabric.Hyperlinq/Generator.AsValueEnumerable.cs b/NetFabric.Hyperlinq/Generator.AsValueEnumerable.cs new file mode 100644 index 000000000..99d722e67 --- /dev/null +++ b/NetFabric.Hyperlinq/Generator.AsValueEnumerable.cs @@ -0,0 +1,470 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using NetFabric.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Threading; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + public partial class Generator + { + static ValueEnumerableType? GenerateSourceAsValueEnumerable(Compilation compilation, SemanticModel semanticModel, TypeSymbolsCache typeSymbolsCache, MemberAccessExpressionSyntax expressionSyntax, CodeBuilder builder, Dictionary generatedMethods, CancellationToken cancellationToken) + { + // Check if the method is already defined in the project source + if (semanticModel.GetSymbolInfo(expressionSyntax, cancellationToken).Symbol is IMethodSymbol { } methodSymbol) + return methodSymbol.ReturnType.ToValueEnumerableType(typeSymbolsCache); + + // Get the type this operator is applied to + var receiverTypeSymbol = semanticModel.GetTypeInfo(expressionSyntax.Expression, cancellationToken).Type; + + // Check if NetFabric.Hyperlinq already contains specific overloads for this type + // This is required for when the 'using NetFabric.Hyperlinq;' statement is missing + if (receiverTypeSymbol is null + or { TypeKind: TypeKind.Array } // is array + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(ArraySegment<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(Span<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(ReadOnlySpan<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(Memory<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(ReadOnlyMemory<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(List<>)]) + || SymbolEqualityComparer.Default.Equals(receiverTypeSymbol.OriginalDefinition, typeSymbolsCache[typeof(ImmutableArray<>)]) + ) + return null; // Do generate an implementation. The 'using NetFabric.Hyperlinq;' statement should be added instead. + + // Receiver type implements IValueEnumerable<,> + + var valueEnumerableType = AsValueEnumerable(expressionSyntax, compilation, semanticModel, typeSymbolsCache, expressionSyntax, builder, generatedMethods, cancellationToken); + if (valueEnumerableType is not null) + { + // Check if the method is already defined by this generator + var methodSignature = new MethodSignature("AsValueEnumerable", valueEnumerableType.Name); + if (generatedMethods.TryGetValue(methodSignature, out var returnType)) + return returnType; + + // Receiver instance returns itself + _ = builder + .Line() + .GeneratedCodeMethodAttributes() + .AggressiveInliningAttribute() + .Line($"public static {valueEnumerableType.Name} AsValueEnumerable(this {valueEnumerableType.Name} source)") + .Indent().Line($"=> source;"); + + // A new AsValueEnumerable() method has been generated + generatedMethods.Add(methodSignature, valueEnumerableType); + return valueEnumerableType; + } + + // Receiver type is an enumerable + + if (receiverTypeSymbol.IsEnumerable(compilation, out var enumerableSymbols)) + { + var receiverTypeString = receiverTypeSymbol.ToDisplayString(); + + // Check if the method is already defined by this generator + var methodSignature = new MethodSignature("AsValueEnumerable", receiverTypeString); + if (generatedMethods.TryGetValue(methodSignature, out var returnType)) + return returnType; + + // Use an unique identifier to avoid name clashing + var uniqueIdString = builder.IsUnitTest + ? receiverTypeString.Replace('.', '_').Replace(',', '_').Replace('<', '_').Replace('>', '_').Replace('`', '_') + : Guid.NewGuid().ToString().Replace('-', '_'); // Use a GUID to avoid naming overflow + + var enumerableTypeString = $"AsValueEnumerable_{uniqueIdString}"; + var itemType = enumerableSymbols.EnumeratorSymbols.Current.Type; + var itemTypeString = itemType.ToDisplayString(); + + // Check if the returned type by GetEnumerator() does not require a wrapper + var getEnumeratorReturnType = enumerableSymbols.GetEnumerator.ReturnType; + var getEnumeratorReturnTypeString = getEnumeratorReturnType.ToDisplayString(); + + // Check what interfaces the enumerable implements, minimizing the calls to ImplementsInterface() + var enumerableIsIEnumerable = receiverTypeSymbol.ImplementsInterface(SpecialType.System_Collections_Generic_IEnumerable_T, out _); + var enumerableIsICollection = false; + var enumerableIsIReadOnlyCollection = false; + var enumerableIsIList = false; + var enumerableIsIReadOnlyList = false; + if (enumerableIsIEnumerable) + { + enumerableIsICollection = receiverTypeSymbol.ImplementsInterface(SpecialType.System_Collections_Generic_ICollection_T, out _); + if (enumerableIsICollection) + enumerableIsIList = receiverTypeSymbol.ImplementsInterface(SpecialType.System_Collections_Generic_IList_T, out _); + + enumerableIsIReadOnlyCollection = receiverTypeSymbol.ImplementsInterface(SpecialType.System_Collections_Generic_IReadOnlyCollection_T, out _); + if (enumerableIsIReadOnlyCollection) + enumerableIsIReadOnlyList = receiverTypeSymbol.ImplementsInterface(SpecialType.System_Collections_Generic_IReadOnlyList_T, out _); + } + + // Define what value enumerator type will be used + var enumeratorIsIEnumerator = getEnumeratorReturnType.ImplementsInterface(SpecialType.System_Collections_Generic_IEnumerator_T, out _); + + var enumeratorTypeString = enumeratorIsIEnumerator + ? getEnumeratorReturnType.IsValueType + ? getEnumeratorReturnTypeString + : $"ValueEnumerator<{itemTypeString}>" + : $"{enumerableTypeString}.Enumerator"; + + // Generate the method + _ = builder + .Line() + .GeneratedCodeMethodAttributes() + .AggressiveInliningAttribute() + .Line($"public static {enumerableTypeString} AsValueEnumerable(this {receiverTypeString} source)") + .Indent().Line($"=> new(source);"); + + // Generate the value enumerable wrapper + _ = builder + .Line() + .Line($"public readonly struct {enumerableTypeString}"); + + // Define what interfaces the wrapper implements + if (enumerableIsIList || enumerableIsIReadOnlyList) + _ = builder.Indent().Line($": IValueReadOnlyList<{itemTypeString}, {enumeratorTypeString}>, IList<{itemTypeString}>"); + else if (enumerableIsICollection || enumerableIsIReadOnlyCollection) + _ = builder.Indent().Line($": IValueReadOnlyCollection<{itemTypeString}, {enumeratorTypeString}>, ICollection<{itemTypeString}>"); + else + _ = builder.Indent().Line($": IValueEnumerable<{itemTypeString}, {enumeratorTypeString}>"); + + using (builder.Block()) + { + // Define field and constructor + _ = builder + .Line($"readonly {receiverTypeString} source;") + .Line() + .Line($"internal {enumerableTypeString}({receiverTypeString} source)") + .Indent().Line($"=> this.source = source;"); + + // Implement interfaces + ImplementIValueEnumerable(builder, enumerableSymbols, enumeratorTypeString, itemTypeString, enumeratorIsIEnumerator); + if (enumerableIsICollection || enumerableIsIReadOnlyCollection) + { + var sourceIsReferenceType = receiverTypeSymbol.IsReferenceType; + var itemIsReferenceType = itemType.IsReferenceType; + ImplementICollection(builder, itemTypeString, sourceIsReferenceType, itemIsReferenceType, enumerableIsICollection); + + if (enumerableIsIList || enumerableIsIReadOnlyList) + ImplementIList(builder, itemTypeString, sourceIsReferenceType, itemIsReferenceType, enumerableIsIList); + } + + // A new AsValueEnumerable() method has been generated + valueEnumerableType = new ValueEnumerableType( + Name: enumerableTypeString, + EnumeratorType: enumeratorTypeString, + ItemType: itemTypeString, + IsCollection: enumerableIsICollection || enumerableIsIReadOnlyCollection, + IsList: enumerableIsIList || enumerableIsIReadOnlyList); + generatedMethods.Add(methodSignature, valueEnumerableType); + return valueEnumerableType; + } + } + + return null; + } + + static void ImplementIValueEnumerable(CodeBuilder builder, EnumerableSymbols enumerableSymbols, string enumeratorTypeString, string itemTypeString, bool enumeratorIsIEnumerator) + { + var getEnumeratorReturnType = enumerableSymbols.GetEnumerator.ReturnType; + var getEnumeratorReturnTypeString = getEnumeratorReturnType.ToDisplayString(); + + _ = builder + .Line() + .Line($"// Implement IValueEnumerable<{itemTypeString}, {enumeratorTypeString}>") + .Line(); + + if (enumeratorIsIEnumerator) + { + if (getEnumeratorReturnType.IsValueType) + { + // No enumerator wrapper required + _ = builder + .AggressiveInliningAttribute() + .Line($"public {enumeratorTypeString} GetEnumerator() => source.GetEnumerator();") + .Line() + .Line($"IEnumerator<{itemTypeString}> IEnumerable<{itemTypeString}>.GetEnumerator() => GetEnumerator();") + .Line() + .Line($"IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();"); + } + else if (enumerableSymbols.GetEnumerator.ContainingType.IsInterface()) + { + // Use the ValueEnumerator<> enumerator wrapper + _ = builder + .AggressiveInliningAttribute() + .Line($"public ValueEnumerator<{itemTypeString}> GetEnumerator() => new(source.GetEnumerator());") + .Line() + .Line($"IEnumerator<{itemTypeString}> IEnumerable<{itemTypeString}>.GetEnumerator() => source.GetEnumerator();") + .Line() + .Line($"IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();"); + } + else + { + // Use the ValueEnumerator<> enumerator wrapper + _ = builder + .AggressiveInliningAttribute() + .Line($"public ValueEnumerator<{itemTypeString}> GetEnumerator() => new(source.GetEnumerator());") + .Line() + .Line($"IEnumerator<{itemTypeString}> IEnumerable<{itemTypeString}>.GetEnumerator() => source.GetEnumerator();") + .Line() + .Line($"IEnumerator IEnumerable.GetEnumerator() => source.GetEnumerator();"); + } + } + else + { + // A custom enumerator wrapper is required + + _ = builder + .AggressiveInliningAttribute() + .Line($"public Enumerator GetEnumerator() => new(source.GetEnumerator());") + .Line() + .Line($"IEnumerator<{itemTypeString}> IEnumerable<{itemTypeString}>.GetEnumerator() => GetEnumerator();") + .Line() + .Line($"IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();") + .Line(); + + // define a value type enumerator wrapper + using (builder.Block($"public struct Enumerator : IEnumerator<{itemTypeString}>")) + { + _ = builder + .Line($"readonly {getEnumeratorReturnTypeString} source;") + .Line() + .Line($"internal Enumerator({getEnumeratorReturnTypeString} source)") + .Indent().Line("=> this.source = source;") + .Line() + .Line($"public {itemTypeString} Current") + .Line("{") + .Indent().AggressiveInliningAttribute() + .Indent().Line($"get => source.Current;") + .Line("}") + .Line() + .Line("object? IEnumerator.Current => source.Current;") + .Line() + .AggressiveInliningAttribute() + .Line("public bool MoveNext() => source.MoveNext();") + .Line(); + + _ = enumerableSymbols.EnumeratorSymbols.Reset is null + ? builder + .Line("public void Reset() => throw new NotSupportedException();") + : builder + .AggressiveInliningAttribute() + .Line("public void Reset() => source.Reset();"); + + _ = enumerableSymbols.EnumeratorSymbols.Dispose is null + ? builder + .Line() + .AggressiveInliningAttribute() + .Line("public void Dispose() { }") + : builder + .Line() + .AggressiveInliningAttribute() + .Line("public void Dispose() => source.Dispose();"); + } + } + } + + static void ImplementICollection(CodeBuilder builder, string itemTypeString, bool sourceIsReferenceType, bool itemIsReferenceType, bool sourceIsICollection) + { + _ = builder + .Line() + .Line($"// Implement ICollection<{itemTypeString}>") + .Line() + .Line("public int Count => source.Count;") + .Line() + .Line("public bool IsReadOnly => true;") + .Line() + .Line($"void ICollection<{itemTypeString}>.Add({itemTypeString} item) => throw new NotSupportedException();") + .Line() + .Line($"bool ICollection<{itemTypeString}>.Remove({itemTypeString} item) => throw new NotSupportedException();") + .Line() + .Line($"void ICollection<{itemTypeString}>.Clear() => throw new NotSupportedException();"); + + if (sourceIsICollection) + { + // Call the methods implemented by the source + _ = builder + .Line() + .AggressiveInliningAttribute() + .Line($"public bool Contains({itemTypeString} item) => source.Contains(item);") + .Line() + .AggressiveInliningAttribute() + .Line($"public void CopyTo({itemTypeString}[] array, int arrayIndex) => source.CopyTo(array, arrayIndex);"); + + return; // nothing else to do + } + + // The source does not implement these methods so we have to add an implementation + _ = builder + .Line() + .MethodBlock($"public bool Contains({itemTypeString} item)", + codeBuilder => + { + _ = codeBuilder + .Line("if (Count is 0)") + .Indent().Line("return false;"); + + if (sourceIsReferenceType) + { + _ = codeBuilder + .Line() + .Line($"if (source is ICollection<{itemTypeString}> collection)") + .Indent().Line("return collection.Contains(item);"); + } + + if (itemIsReferenceType) + { + _ = codeBuilder + .Line() + .Line($"var comparer = EqualityComparer<{itemTypeString}>.Default;") + .Line("using var enumerator = GetEnumerator();") + .WhileBlock("enumerator.MoveNext()", + codeBuilder => _ = codeBuilder + .Line("if (comparer.Equals(enumerator.Current, item))") + .Indent().Line("return true;") + ); + } + else // devirtualize the comparer + { + _ = codeBuilder + .Line() + .Line("using var enumerator = GetEnumerator();") + .WhileBlock("enumerator.MoveNext()", + codeBuilder => _ = codeBuilder + .Line($"if (EqualityComparer<{itemTypeString}>.Default.Equals(enumerator.Current, item))") + .Indent().Line("return true;") + ); + } + + _ = codeBuilder + .Line("return false;"); + }); + + _ = builder + .Line() + .MethodBlock($"public void CopyTo({itemTypeString}[] array, int arrayIndex)", + codeBuilder => + { + _ = codeBuilder + .Line("if (Count is 0)") + .Indent().Line("return;") + .Line() + .Line("if (array.Length - arrayIndex < Count)") + .Indent().Line($"throw new ArgumentException(\"{Resource.DestinationNotLongEnough}\", nameof(array));"); + + if (sourceIsReferenceType) + { + codeBuilder + .Line() + .IfBlock($"source is ICollection<{itemTypeString}> collection", + codeBuilder => _ = codeBuilder + .Line("collection.CopyTo(array, arrayIndex);") + .Line("return;")); + } + + _ = codeBuilder + .Line() + .Line("using var enumerator = GetEnumerator();") + .IfBlock( + "arrayIndex is 0 && array.Length == Count", // to enable range check elimination + codeBuilder => _ = codeBuilder + .Line( + "for (var index = 0; index < array.Length && enumerator.MoveNext(); index++)") + .Indent().Line("array[index] = enumerator.Current;"), + codeBuilder => _ = codeBuilder + .CheckedBlock( + codeBuilder => _ = codeBuilder + .Line( + "for (var index = arrayIndex; enumerator.MoveNext(); index++)") + .Indent().Line("array[index] = enumerator.Current;") + ) + ); + }); + } + + static void ImplementIList(CodeBuilder builder, string itemTypeString, bool sourceIsReferenceType, bool itemIsReferenceType, bool sourceIsIList) + { + _ = builder + .Line() + .Line($"// Implement IList<{itemTypeString}>") + .Line() + .Line($"public {itemTypeString} this[int index] => source[index];") + .Line(); + + using (builder.Block($"{itemTypeString} IList<{itemTypeString}>.this[int index]")) + { + _ = builder + .Line("get => source[index];") + .Line("set => throw new NotSupportedException();"); + } + + _ = builder + .Line() + .Line($"void IList<{itemTypeString}>.Insert(int index, {itemTypeString} item) => throw new NotSupportedException();") + .Line() + .Line($"void IList<{itemTypeString}>.RemoveAt(int index) => throw new NotSupportedException();") + .Line(); + + if (sourceIsIList) + { + // Call the methods implemented by the source + _ = builder + .AggressiveInliningAttribute() + .Line($"public int IndexOf({itemTypeString} item) => source.IndexOf(item);"); + + return; + } + + // The source does not implement these methods so we have to add an implementation + builder + .MethodBlock($"public int IndexOf({itemTypeString} item)", + codeBuilder => codeBuilder + .IfBlock("Count is not 0", + codeBuilder => + { + if (sourceIsReferenceType) + { + codeBuilder + .Line($"if (source is IList<{itemTypeString}> list)") + .Indent().Line("return list.IndexOf(item);") + .Line(); + } + + codeBuilder + .CheckedBlock( + codeBuilder => + { + if (itemIsReferenceType) + { + codeBuilder + .Line($"var comparer = EqualityComparer<{itemTypeString}>.Default;") + .Line("var index = 0;") + .ForEachBlock("var current in source", + codeBuilder => codeBuilder + .Line($"if (comparer.Equals(current, item))") + .Indent().Line("return index;") + .Line() + .Line("index++;") + ); + } + else // devirtualize the comparer + { + codeBuilder + .Line("var index = 0;") + .ForEachBlock("var current in source", + codeBuilder => codeBuilder + .Line( + $"if (EqualityComparer<{itemTypeString}>.Default.Equals(current, item))") + .Indent().Line("return index;") + .Line() + .Line("index++;") + ); + } + }); + }) + .Line("return -1;") + ); + } + + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Generator.cs b/NetFabric.Hyperlinq/Generator.cs new file mode 100644 index 000000000..8bebaa42d --- /dev/null +++ b/NetFabric.Hyperlinq/Generator.cs @@ -0,0 +1,349 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Microsoft.CodeAnalysis.Text; +using NetFabric.CodeAnalysis; +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Reflection.Metadata; +using System.Text; +using System.Threading; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + [Generator] + public partial class Generator + : ISourceGenerator + { + static readonly string assemblyName = typeof(CodeBuilder).Assembly.GetName().Name; + static readonly string assemblyVersion = typeof(CodeBuilder).Assembly.GetCustomAttribute()?.InformationalVersion ?? string.Empty; + + static readonly DiagnosticDescriptor unhandledExceptionError = new( + id: "HPLG001", + title: "Unhandled exception while generating overloads", + messageFormat: "Unhandled exception while generating overloads: {0}", + category: "OverloadsGenerator", + DiagnosticSeverity.Error, + isEnabledByDefault: true); + + internal static readonly ImmutableHashSet methods = ImmutableHashSet.Create(new[] + { + // aggregation + "Count", + "CountAsync", + "Sum", + "SumVector", + "SumAsync", + + // conversion + "AsEnumerable", + "AsAsyncEnumerable", + "AsValueEnumerable", + "AsAsyncValueEnumerable", + "ToArray", + "ToArrayVector", + "ToArrayAsync", + "ToDictionary", + "ToDictionaryAsync", + "ToList", + "ToListVector", + "ToListAsync", + + // element + "ElementAt", + "ElementAtAsync", + "First", + "FirstAsync", + "Single", + "SingleAsync", + + // filtering + "Where", + "WhereAsync", + + // partitioning + "Skip", + "SkipAsync", + "Take", + "TakeAsync", + + // projection + "Select", + "SelectVector", + "SelectAsync", + "SelectMany", + "SelectManyAsync", + + // quantifier + "All", + "AllAsync", + "Any", + "AnyAsync", + "Contains", + "ContainsVector", + "ContainsAsync", + + // quantifier + "Distinct", + "DistinctAsync", + }); + + static readonly ImmutableHashSet sumTypes = ImmutableHashSet.Create(new[] + { + "int", + "int?", + "nint", + "nint?", + "nuint", + "nuint?", + "long", + "long?", + "float", + "float?", + "double", + "double?", + "decimal", + "decimal?", + }); + + public void Initialize(GeneratorInitializationContext context) + { +#if DEBUG + if (!Debugger.IsAttached) + _ = Debugger.Launch(); +#endif + + context.RegisterForSyntaxNotifications(() => new SyntaxReceiver(methods)); + } + + public void Execute(GeneratorExecutionContext context) + { + var typeSymbolsCache = new TypeSymbolsCache(context.Compilation); + + // Check if NetFabric.Hyperlinq.Abstractions and NetFabric.Hyperlinq.Abstractions are referenced + if (typeSymbolsCache[typeof(IValueEnumerable<,>)] is null + || typeSymbolsCache[typeof(ValueEnumerableExtensions)] is null) + return; // TODO: return a Diagnostic? + + if (context.SyntaxReceiver is not SyntaxReceiver receiver) + return; + + try + { + var builder = new CodeBuilder(); + GenerateSource(context.Compilation, typeSymbolsCache, receiver.MemberAccessExpressions, builder, context.CancellationToken); + context.AddSource("ExtensionMethods.g.cs", SourceText.From(builder.ToString(), Encoding.UTF8)); + } + catch (OperationCanceledException) + { + throw; + } + catch (Exception ex) + { + context.ReportDiagnostic(Diagnostic.Create(unhandledExceptionError, Location.None, ex.Message)); + } + } + + internal static void GenerateSource(Compilation compilation, TypeSymbolsCache typeSymbolsCache, List memberAccessExpressions, CodeBuilder builder, CancellationToken cancellationToken) + { + var generatedMethods = new Dictionary(); + + _ = builder + .Line("#nullable enable") + .Line() + .Line("using System;") + .Line("using System.CodeDom.Compiler;") + .Line("using System.Collections;") + .Line("using System.Collections.Generic;") + .Line("using System.ComponentModel;") + .Line("using System.Diagnostics;") + .Line("using System.Diagnostics.CodeAnalysis;") + .Line("using System.Runtime.CompilerServices;") + .Line() + .Line("namespace NetFabric.Hyperlinq;") + .Line(); + + using (builder.Block("static partial class GeneratedExtensionMethods")) + { + foreach (var expressionSyntax in memberAccessExpressions) + { + cancellationToken.ThrowIfCancellationRequested(); + + var semanticModel = compilation.GetSemanticModel(expressionSyntax.SyntaxTree); + + _ = GenerateSource(compilation, semanticModel, typeSymbolsCache, expressionSyntax, builder, generatedMethods, cancellationToken); + } + } + } + + static ValueEnumerableType? AsValueEnumerable(MemberAccessExpressionSyntax memberAccessExpressionSyntax, Compilation compilation, SemanticModel semanticModel, TypeSymbolsCache typeSymbolsCache, MemberAccessExpressionSyntax expressionSyntax, CodeBuilder builder, Dictionary generatedMethods, CancellationToken cancellationToken) + { + var typeSymbol = semanticModel.GetTypeInfo(memberAccessExpressionSyntax.Expression, cancellationToken).Type; + if (typeSymbol is null) + return null; + + // Check if the receiver type implements IValueEnumerable<,> + var valueEnumerableType = typeSymbol.ToValueEnumerableType(typeSymbolsCache); + if (valueEnumerableType is not null) + return valueEnumerableType; + + // Go up one layer. Generate method if required. + if (expressionSyntax.Expression is InvocationExpressionSyntax { Expression: MemberAccessExpressionSyntax receiverSyntax }) + { + valueEnumerableType = GenerateSource(compilation, semanticModel, typeSymbolsCache, receiverSyntax, builder, generatedMethods, cancellationToken); + if (valueEnumerableType is not null) + return valueEnumerableType; + } + + // Receiver type does not implement IValueEnumerable<,> so nothing else needs to be done + return null; + } + + static ValueEnumerableType? GenerateSource(Compilation compilation, SemanticModel semanticModel, TypeSymbolsCache typeSymbolsCache, MemberAccessExpressionSyntax expressionSyntax, CodeBuilder builder, Dictionary generatedMethods, CancellationToken cancellationToken) + => expressionSyntax.Name.ToString() switch + { + "AsValueEnumerable" => GenerateSourceAsValueEnumerable(compilation, semanticModel, typeSymbolsCache, expressionSyntax, builder, generatedMethods, cancellationToken), + _ => GenerateSourceDefault(compilation, semanticModel, typeSymbolsCache, expressionSyntax, builder, generatedMethods, cancellationToken), + }; + + static ValueEnumerableType? GenerateSourceDefault(Compilation compilation, SemanticModel semanticModel, TypeSymbolsCache typeSymbolsCache, MemberAccessExpressionSyntax expressionSyntax, CodeBuilder builder, Dictionary generatedMethods, CancellationToken cancellationToken) + { + // Find the receiver type + var receiverType = AsValueEnumerable(expressionSyntax, compilation, semanticModel, typeSymbolsCache, expressionSyntax, builder, generatedMethods, cancellationToken); + if (receiverType is null) + return null; + + var methodName = expressionSyntax.Name.ToString(); + if (methodName == "Sum" && !sumTypes.Contains(receiverType.ItemType)) + return null; + + var containingClass = receiverType.IsList + ? typeSymbolsCache[typeof(ValueReadOnlyListExtensions)]! + : receiverType.IsCollection + ? typeSymbolsCache[typeof(ValueReadOnlyCollectionExtensions)]! + : typeSymbolsCache[typeof(ValueEnumerableExtensions)]!; + var containingClassString = containingClass.ToDisplayString(); + + // Check if the method is already defined + var symbol = semanticModel.GetSymbolInfo(expressionSyntax, cancellationToken).Symbol; + if (symbol is IMethodSymbol methodSymbol) + { + // If it's an instance method of a type that implements IValueEnumerable<,> then it's already optimized. + if (methodSymbol.ReceiverType is not null && methodSymbol.ReceiverType.ImplementsInterface(typeSymbolsCache[typeof(IValueEnumerable<,>)]!, out _)) + return methodSymbol.ReturnType.ToValueEnumerableType(typeSymbolsCache); // return the returned type + + // Check if the generator already generated the extension method + var parameters = methodSymbol.Parameters.Select(parameter => parameter.Type.ToDisplayString()) + .ToArray(); + var methodSignature = + new MethodSignature(expressionSyntax.Name.ToString(), receiverType.Name, parameters); + if (generatedMethods.TryGetValue(methodSignature, out var returnType)) + return returnType; + + // Generate the extension method + var comparer = new TypeSymbolConversionComparer(compilation); + var parametersTypes = methodSymbol.Parameters.Select(parameter => parameter.Type).ToArray(); + var hyperlinqMethods = containingClass + .GetMembers() + .OfType() + .Where(method => + method.IsPublic() + && method.Name == methodName + && method.Parameters.Skip(1).Select(parameter => parameter.Type).SequenceEqual(parametersTypes, comparer)) + .ToArray(); + var hyperlinqMethod = hyperlinqMethods.FirstOrDefault(); + if (hyperlinqMethod is null) + return null; + + var parametersString = string.Join(", ", + new[] { $"{receiverType.Name} source" } + .Concat(methodSymbol.Parameters.Select(static parameter => $"{parameter.Type.ToDisplayString()} {parameter.Name}"))); + var argumentsString = string.Join(", ", + new[] { "source" } + .Concat(methodSymbol.Parameters.Select(parameter => MapArgument(parameter, typeSymbolsCache)))); + var typeArgumentsString = string.Join(", ", + new[] { receiverType.Name, receiverType.EnumeratorType } + .Concat(methodSymbol.TypeArguments.Select(argument => MapTypeArgument(argument, typeSymbolsCache)))); + var returnTypeString = hyperlinqMethod.ReturnType is INamedTypeSymbol { IsGenericType: true } + ? $"{hyperlinqMethod.ReturnType.ContainingType}.{hyperlinqMethod.ReturnType.Name}<{typeArgumentsString}>" + : hyperlinqMethod.ReturnType.ToDisplayString(); + _ = builder + .Line() + .GeneratedCodeMethodAttributes() + .Line("[MethodImpl(MethodImplOptions.AggressiveInlining)]") + .Line($"public static {returnTypeString} {methodSymbol.Name}(this {parametersString})") + .Indent() + .Line($"=> {containingClassString}.{methodSymbol.Name}<{typeArgumentsString}>({argumentsString});"); + } + + // The method is not yet defined + if (expressionSyntax.Parent is InvocationExpressionSyntax invocation) + { + var a = invocation.ArgumentList.Arguments + .Select(argument => semanticModel.GetTypeInfo(argument.Expression).Type) + .ToArray(); + // Check if the generator already generated the extension method + //var parameters = new string[] { receiverType.Name }.Concat(invocation.ArgumentList.Arguments.Select(argument => argument.ToDisplayString())).ToArray(); + //var methodSignature = new MethodSignature(expressionSyntax.Name.ToString(), parameters); + //if (generatedMethods.TryGetValue(methodSignature, out var returnType)) + // return returnType; + + //// Generate the extension method + //var hyperlinqMethod = hyperlinqMethods.FirstOrDefault(); + + //var parametersString = string.Join(", ", + // new string[] { $"{receiverType.Name} source" } + // .Concat(methodSymbol.Parameters.Select(parameter => $"{parameter.Type.ToDisplayString()} {parameter.Name}"))); + //var argumentsString = string.Join(", ", + // new string[] { "source" } + // .Concat(methodSymbol.Parameters.Select(parameter => parameter.Name))); + //_ = builder + // .Line() + // .Line("[MethodImpl(MethodImplOptions.AggressiveInlining)]") + // .Line($"public static {hyperlinqMethod.ReturnType.ToDisplayString()} {methodSymbol.Name}(this {parametersString})") + // .Indent().Line($"=> {containingClassString}.{methodSymbol.Name}<{receiverType.Name}, {receiverType.EnumeratorType}, {receiverType.ItemType}>({argumentsString});"); + + //generatedMethods.Add(methodSignature, returnType); + //return returnType; + } + + return null; + + static string MapArgument(IParameterSymbol parameter, TypeSymbolsCache typeSymbolsCache) + { + if (parameter.Type is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol) + { + // Convert Func<> to FunctionWrapper<> + if (SymbolEqualityComparer.Default.Equals(parameter.Type.OriginalDefinition, typeSymbolsCache[typeof(Func<,>)])) + { + var typeArguments = string.Join(", ", + namedTypeSymbol.TypeArguments.Select(argument => argument.ToDisplayString())); + return $"new NetFabric.Hyperlinq.FunctionWrapper<{typeArguments}>({parameter.Name})"; + } + } + + return parameter.Name; + } + + static string MapTypeArgument(ITypeSymbol argument, TypeSymbolsCache typeSymbolsCache) + { + if (argument is INamedTypeSymbol { IsGenericType: true } namedTypeSymbol) + { + // Convert Func<> to FunctionWrapper<> + if (SymbolEqualityComparer.Default.Equals(argument.OriginalDefinition, typeSymbolsCache[typeof(Func<,>)])) + { + var typeArguments = string.Join(", ", + namedTypeSymbol.TypeArguments.Select(argument => argument.ToDisplayString())); + return $"NetFabric.Hyperlinq.FunctionWrapper<{typeArguments}>"; + } + } + + return argument.ToDisplayString(); + } + } + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq/ITypeSymbolExtensions.cs b/NetFabric.Hyperlinq/ITypeSymbolExtensions.cs new file mode 100644 index 000000000..596bdd104 --- /dev/null +++ b/NetFabric.Hyperlinq/ITypeSymbolExtensions.cs @@ -0,0 +1,53 @@ +using Microsoft.CodeAnalysis; +using NetFabric.CodeAnalysis; +using System.Collections.Immutable; +using System.Runtime.CompilerServices; + +// ReSharper disable LoopCanBeConvertedToQuery + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + static class ITypeSymbolExtensions + { + public static bool ImplementsAnyInterface(this ITypeSymbol typeSymbol, INamedTypeSymbol[] interfaceTypes, out ImmutableArray genericArguments) + { + if (typeSymbol is INamedTypeSymbol namedTypeSymbol) + { + foreach (var interfaceType in interfaceTypes) + { + if (SymbolEqualityComparer.Default.Equals(namedTypeSymbol.OriginalDefinition, interfaceType)) + { + genericArguments = namedTypeSymbol.TypeArguments; + return true; + } + } + } + + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var @interface in typeSymbol.AllInterfaces) + { + foreach (var interfaceType in interfaceTypes) + { + if (SymbolEqualityComparer.Default.Equals(@interface.OriginalDefinition, interfaceType)) + { + genericArguments = @interface.TypeArguments; + return true; + } + } + } + + Unsafe.SkipInit(out genericArguments); + return false; + } + + public static ValueEnumerableType? ToValueEnumerableType(this ITypeSymbol typeSymbol, TypeSymbolsCache typeSymbolsCache) + => !typeSymbol.ImplementsInterface(typeSymbolsCache[typeof(IValueEnumerable<,>)]!, out var genericArguments) + ? null + : new ValueEnumerableType( + Name: typeSymbol.ToDisplayString(), + EnumeratorType: genericArguments[1].ToDisplayString(), + ItemType: genericArguments[0].ToDisplayString(), + IsCollection: typeSymbol.ImplementsInterface(typeSymbolsCache[typeof(IValueReadOnlyCollection<,>)]!, out _), + IsList: typeSymbol.ImplementsInterface(typeSymbolsCache[typeof(IValueReadOnlyList<,>)]!, out _)); + } +} diff --git a/NetFabric.Hyperlinq/MethodSignature.cs b/NetFabric.Hyperlinq/MethodSignature.cs new file mode 100644 index 000000000..cdd27a357 --- /dev/null +++ b/NetFabric.Hyperlinq/MethodSignature.cs @@ -0,0 +1,41 @@ +using Microsoft.CodeAnalysis; +using System; +using System.Collections.Immutable; +using System.Linq; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + readonly struct MethodSignature + : IEquatable + { + public MethodSignature(string name, string receiverType, params string[] parameters) + => (Name, ReceiverType, Parameters) = (name, receiverType, ImmutableArray.Create(parameters)); + + string Name { get; } + string ReceiverType { get; } + ImmutableArray Parameters { get; } + + public bool Equals(MethodSignature other) + => Name == other.Name && ReceiverType == other.ReceiverType && Parameters.SequenceEqual(other.Parameters); + + public override bool Equals(object other) + => other is MethodSignature signature && Equals(signature); + + public override int GetHashCode() + { + unchecked + { + const int hashingBase = (int)2166136261; + const int hashingMultiplier = 16777619; + + var hash = hashingBase; + hash = (hash * hashingMultiplier) ^ Name.GetHashCode(); + hash = (hash * hashingMultiplier) ^ ReceiverType.GetHashCode(); + // ReSharper disable once ForeachCanBeConvertedToQueryUsingAnotherGetEnumerator + foreach(var parameter in Parameters) + hash = (hash * hashingMultiplier) ^ parameter.GetHashCode(); + return hash; + } + } + } +} diff --git a/NetFabric.Hyperlinq/NetFabric.Hyperlinq.csproj b/NetFabric.Hyperlinq/NetFabric.Hyperlinq.csproj index 1b7b2c4eb..ff22ce1c4 100644 --- a/NetFabric.Hyperlinq/NetFabric.Hyperlinq.csproj +++ b/NetFabric.Hyperlinq/NetFabric.Hyperlinq.csproj @@ -1,60 +1,55 @@  - netstandard2.0;netcoreapp3.1;net5.0;net6.0 - NetFabric.Hyperlinq - NetFabric.Hyperlinq + netstandard2.0 + NetFabric.Hyperlinq.SourceGenerator + NetFabric.Hyperlinq.SourceGenerator High performance LINQ implementation with minimal heap allocations. Supports enumerables, async enumerables, Memory, and Span. 3.0.0-beta48 Icon.png LICENSE netfabric, hyperlinq, linq, enumeration, extensions, performance true - true - true - snupkg - true - - - - - - $(NoWarn);8600;8601;8602;8603;8604 + true + false - + + + true + + + + true + - - - - - - - + + - + - - - + + + + + - - - + + + + + + - - - - - - + - - - + + all runtime; build; native; contentfiles; analyzers @@ -62,33 +57,29 @@ all runtime; build; native; contentfiles; analyzers - - all - runtime; build; native; contentfiles; analyzers - - + all runtime; build; native; contentfiles; analyzers; buildtransitive + + + all + runtime; build; native; contentfiles; analyzers - - - - True - True - Resource.resx - - - + ResXFileCodeGenerator Resource.Designer.cs - + - + + True + True + Resources.resx + diff --git a/NetFabric.Hyperlinq/Properties/AssemblyInfo.cs b/NetFabric.Hyperlinq/Properties/AssemblyInfo.cs index 718964469..a48e711f2 100644 --- a/NetFabric.Hyperlinq/Properties/AssemblyInfo.cs +++ b/NetFabric.Hyperlinq/Properties/AssemblyInfo.cs @@ -1,3 +1,3 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; -[assembly:InternalsVisibleTo("NetFabric.Hyperlinq.UnitTests")] \ No newline at end of file +[assembly: InternalsVisibleTo("NetFabric.Hyperlinq.UnitTests")] \ No newline at end of file diff --git a/NetFabric.Hyperlinq/Quantifier/Any/Any.ValueReadOnlyCollection.cs b/NetFabric.Hyperlinq/Quantifier/Any/Any.ValueReadOnlyCollection.cs deleted file mode 100644 index b1712c02e..000000000 --- a/NetFabric.Hyperlinq/Quantifier/Any/Any.ValueReadOnlyCollection.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; - -namespace NetFabric.Hyperlinq -{ - public static partial class ValueReadOnlyCollectionExtensions - { - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => source.Count is not 0; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => Any>(source, new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.Count is not 0 && ValueEnumerableExtensions.Any(source, predicate); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool Any(this TEnumerable source, Func predicate) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - => AnyAt>(source, new FunctionWrapper(predicate)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool AnyAt(this TEnumerable source, TPredicate predicate = default) - where TEnumerable : IValueReadOnlyCollection - where TEnumerator : struct, IEnumerator - where TPredicate : struct, IFunction - => source.Count is not 0 && ValueEnumerableExtensions.AnyAt(source, predicate); - } -} - diff --git a/NetFabric.Hyperlinq/Resource.Designer.cs b/NetFabric.Hyperlinq/Resource.Designer.cs index ff4ee5dc4..f8a357e32 100644 --- a/NetFabric.Hyperlinq/Resource.Designer.cs +++ b/NetFabric.Hyperlinq/Resource.Designer.cs @@ -11,7 +11,7 @@ namespace NetFabric.Hyperlinq { using System; - [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resource { @@ -45,28 +45,10 @@ internal static System.Globalization.CultureInfo Culture { } } - internal static string ArraySegmentNull { - get { - return ResourceManager.GetString("ArraySegmentNull", resourceCulture); - } - } - internal static string DestinationNotLongEnough { get { return ResourceManager.GetString("DestinationNotLongEnough", resourceCulture); } } - - internal static string EmptySequence { - get { - return ResourceManager.GetString("EmptySequence", resourceCulture); - } - } - - internal static string NotSingleSequence { - get { - return ResourceManager.GetString("NotSingleSequence", resourceCulture); - } - } } } diff --git a/NetFabric.Hyperlinq/Resource.resx b/NetFabric.Hyperlinq/Resource.resx index 260aed1d5..d217097c0 100644 --- a/NetFabric.Hyperlinq/Resource.resx +++ b/NetFabric.Hyperlinq/Resource.resx @@ -1,132 +1,24 @@ - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - The array in the ArraySegment is null - - - Destination array was not long enough. Check the destination index, length, and the rentedArray's lower bounds. - - - Sequence contains no elements - - - Sequence contains more than one element - \ No newline at end of file diff --git a/NetFabric.Hyperlinq/SyntaxReceiver.cs b/NetFabric.Hyperlinq/SyntaxReceiver.cs new file mode 100644 index 000000000..56fd3dd59 --- /dev/null +++ b/NetFabric.Hyperlinq/SyntaxReceiver.cs @@ -0,0 +1,33 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using System.Collections.Generic; +using System.Collections.Immutable; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + class SyntaxReceiver : ISyntaxReceiver + { + readonly ImmutableHashSet memberAccessNames; + + public SyntaxReceiver(ImmutableHashSet memberAccessNames) + => this.memberAccessNames = memberAccessNames; + + public List MemberAccessExpressions { get; } = new(); + + public void OnVisitSyntaxNode(SyntaxNode syntaxNode) + { + switch (syntaxNode) + { + case MemberAccessExpressionSyntax { Name: var memberName } memberAccessExpression: + if (memberAccessExpression.Kind() == SyntaxKind.SimpleMemberAccessExpression + && memberAccessNames.Contains(memberName.Identifier.ValueText)) + { + // It's a SimpleMemberAccessExpression and its name is in memberAccessNames collection + MemberAccessExpressions.Add(memberAccessExpression); + } + break; + } + } + } +} diff --git a/NetFabric.Hyperlinq/TypeSymbolsCache.cs b/NetFabric.Hyperlinq/TypeSymbolsCache.cs new file mode 100644 index 000000000..f3694a1e6 --- /dev/null +++ b/NetFabric.Hyperlinq/TypeSymbolsCache.cs @@ -0,0 +1,28 @@ +using Ben.Collections; +using Microsoft.CodeAnalysis; +using System; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + class TypeSymbolsCache + { + readonly Compilation compilation; + readonly TypeDictionary cacheByType = new(); + + public TypeSymbolsCache(Compilation compilation) + => this.compilation = compilation; + + public INamedTypeSymbol? this[Type type] + { + get + { + if (cacheByType.TryGetValue(type, out var symbol)) + return symbol; + + symbol = compilation.GetTypeByMetadataName(type.FullName); + cacheByType[type] = symbol; + return symbol; + } + } + } +} diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/AttributeExtensions.cs b/NetFabric.Hyperlinq/Utils/AttributeExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/AttributeExtensions.cs rename to NetFabric.Hyperlinq/Utils/AttributeExtensions.cs diff --git a/NetFabric.Hyperlinq/Utils/CodeBuilder.cs b/NetFabric.Hyperlinq/Utils/CodeBuilder.cs new file mode 100644 index 000000000..1d81877fb --- /dev/null +++ b/NetFabric.Hyperlinq/Utils/CodeBuilder.cs @@ -0,0 +1,152 @@ +using System; +using System.IO; +using System.Reflection; +using System.Text; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + class CodeBuilder + { + const string indentation = " "; + + readonly StringBuilder builder = new(); + int currentLevel = 0; + + public bool IsUnitTest { get; init; } = false; + + StringBuilder AppendIndents() + { + for (var level = 0; level < currentLevel; level++) + _ = builder.Append(indentation); + + return builder; + } + + public CodeBuilder Indent() + { + _ = builder.Append(indentation); + return this; + } + + public CodeBuilder Line() + { + _ = builder.AppendLine(); + return this; + } + + public CodeBuilder Line(char text) + { + _ = AppendIndents().Append(text).AppendLine(); + return this; + } + + public CodeBuilder Line(string text) + { + _ = AppendIndents().AppendLine(text); + return this; + } + + public CodeBuilder Line(Action line) + { + _ = AppendIndents(); + line(builder); + _ = Line(); + return this; + } + + public IDisposable Block() + { + _ = Line('{'); + currentLevel++; + // ReSharper disable once HeapView.ObjectAllocation.Evident + return new CloseBlock(this); + } + + public IDisposable Block(string text) + => Line(text).Block(); + + public CodeBuilder MethodBlock(string header, Action block) + { + using (Block(header)) + { + block(this); + } + return this; + } + + public CodeBuilder IfBlock(string condition, Action block) + { + using (Block($"if ({condition})")) + { + block(this); + } + return this; + } + + public CodeBuilder IfBlock(string condition, Action trueBlock, Action falseBlock) + { + using (Block($"if ({condition})")) + { + trueBlock(this); + } + using (Block("else")) + { + falseBlock(this); + } + return this; + } + + public CodeBuilder ForEachBlock(string text, Action block) + { + using (Block($"foreach ({text})")) + { + block(this); + } + return this; + } + + public CodeBuilder ForBlock(string text, Action block) + { + using (Block($"for ({text})")) + { + block(this); + } + return this; + } + + public CodeBuilder WhileBlock(string text, Action block) + { + using (Block($"while ({text})")) + { + block(this); + } + return this; + } + + public CodeBuilder CheckedBlock(Action block) + { + using (Block("checked")) + { + block(this); + } + return this; + } + + class CloseBlock : IDisposable + { + readonly CodeBuilder builder; + + public CloseBlock(CodeBuilder builder) + => this.builder = builder; + + public void Dispose() + { + builder.currentLevel--; + _ = builder.Line('}'); + } + } + + public override string ToString() + => builder.ToString(); + } +} diff --git a/NetFabric.Hyperlinq/Utils/CodeBuilderExtensions.cs b/NetFabric.Hyperlinq/Utils/CodeBuilderExtensions.cs new file mode 100644 index 000000000..8c9725da7 --- /dev/null +++ b/NetFabric.Hyperlinq/Utils/CodeBuilderExtensions.cs @@ -0,0 +1,25 @@ +using System; +using System.Reflection; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + static class CodeBuilderExtensions + { + static readonly string assemblyName = typeof(CodeBuilder).Assembly + .GetName().Name; + static readonly string assemblyVersion = typeof(CodeBuilder).Assembly + .GetCustomAttribute()?.InformationalVersion + ?? string.Empty; + + public static CodeBuilder GeneratedCodeMethodAttributes(this CodeBuilder builder) + => builder.IsUnitTest + ? builder // do nothing + : builder.Line($"[GeneratedCode(\"{assemblyName}\", \"{assemblyVersion}\")]") + .Line("[DebuggerNonUserCode]") + .Line("[ExcludeFromCodeCoverage]") + .Line("[EditorBrowsable(EditorBrowsableState.Never)]"); + + public static CodeBuilder AggressiveInliningAttribute(this CodeBuilder builder) + => builder.Line("[MethodImpl(MethodImplOptions.AggressiveInlining)]"); + } +} diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/DictionarySet.cs b/NetFabric.Hyperlinq/Utils/DictionarySet.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/DictionarySet.cs rename to NetFabric.Hyperlinq/Utils/DictionarySet.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/MethodSymbolExtensions.cs b/NetFabric.Hyperlinq/Utils/MethodSymbolExtensions.cs similarity index 98% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/MethodSymbolExtensions.cs rename to NetFabric.Hyperlinq/Utils/MethodSymbolExtensions.cs index 8b92294ce..a04fe3d7e 100644 --- a/NetFabric.Hyperlinq.SourceGenerator/Utils/MethodSymbolExtensions.cs +++ b/NetFabric.Hyperlinq/Utils/MethodSymbolExtensions.cs @@ -54,7 +54,7 @@ public static MethodInfo GetInfo(this IMethodSymbol method, CompilationContext c throw; } - string ToDisplayString(object? obj) + static string ToDisplayString(object? obj) => obj switch { null => "", diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/NamespaceSymbolExtensions.cs b/NetFabric.Hyperlinq/Utils/NamespaceSymbolExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/NamespaceSymbolExtensions.cs rename to NetFabric.Hyperlinq/Utils/NamespaceSymbolExtensions.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/StringExtensions.cs b/NetFabric.Hyperlinq/Utils/StringExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/StringExtensions.cs rename to NetFabric.Hyperlinq/Utils/StringExtensions.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/SymbolExtensions.cs b/NetFabric.Hyperlinq/Utils/SymbolExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/SymbolExtensions.cs rename to NetFabric.Hyperlinq/Utils/SymbolExtensions.cs diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/TypeParameterSymbolExtensions.cs b/NetFabric.Hyperlinq/Utils/TypeParameterSymbolExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/TypeParameterSymbolExtensions.cs rename to NetFabric.Hyperlinq/Utils/TypeParameterSymbolExtensions.cs diff --git a/NetFabric.Hyperlinq/Utils/TypeSymbolConversionComparer.cs b/NetFabric.Hyperlinq/Utils/TypeSymbolConversionComparer.cs new file mode 100644 index 000000000..f151d8a02 --- /dev/null +++ b/NetFabric.Hyperlinq/Utils/TypeSymbolConversionComparer.cs @@ -0,0 +1,24 @@ +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using System.Collections.Generic; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + public class TypeSymbolConversionComparer + : IEqualityComparer + { + readonly Compilation compilation; + + public TypeSymbolConversionComparer(Compilation compilation) + => this.compilation = compilation; + + public bool Equals(ITypeSymbol x, ITypeSymbol y) + => (x is INamedTypeSymbol { IsGenericType: true } + && y is INamedTypeSymbol { IsGenericType: true } + && compilation.ClassifyConversion(x.OriginalDefinition, y.OriginalDefinition).Exists) + || compilation.ClassifyConversion(x, y).Exists; + + public int GetHashCode(ITypeSymbol obj) + => SymbolEqualityComparer.Default.GetHashCode(obj); + } +} \ No newline at end of file diff --git a/NetFabric.Hyperlinq.SourceGenerator/Utils/TypeSymbolExtensions.cs b/NetFabric.Hyperlinq/Utils/TypeSymbolExtensions.cs similarity index 100% rename from NetFabric.Hyperlinq.SourceGenerator/Utils/TypeSymbolExtensions.cs rename to NetFabric.Hyperlinq/Utils/TypeSymbolExtensions.cs diff --git a/NetFabric.Hyperlinq/ValueEnumerableType.cs b/NetFabric.Hyperlinq/ValueEnumerableType.cs new file mode 100644 index 000000000..28b79c1f2 --- /dev/null +++ b/NetFabric.Hyperlinq/ValueEnumerableType.cs @@ -0,0 +1,6 @@ +using System; + +namespace NetFabric.Hyperlinq.SourceGenerator +{ + record ValueEnumerableType(string Name, string EnumeratorType, string ItemType, bool IsCollection, bool IsList); +} diff --git a/README.md b/README.md index 0709d4fb2..ed0625676 100644 --- a/README.md +++ b/README.md @@ -426,6 +426,7 @@ The following open-source projects are used to build and test this project: - [.NET](https://github.com/dotnet) - [BenchmarkDotNet](https://benchmarkdotnet.org/) +- [Ben.TypeDictionary](https://github.com/benaadams/Ben.TypeDictionary) - [coveralls](https://coveralls.io) - [coverlet](https://github.com/tonerdo/coverlet) - [ILRepack](https://github.com/gluck/il-repack) @@ -434,6 +435,7 @@ The following open-source projects are used to build and test this project: - [NetFabric.Hyperlinq.Analyzer](https://github.com/NetFabric/NetFabric.Hyperlinq.Analyzer) - [Nullable](https://github.com/manuelroemer/Nullable) - [Source Link](https://github.com/dotnet/sourcelink) +- [UnoptimizedAssemblyDetector](https://github.com/bruno-garcia/unoptimized-assembly-detector) - [xUnit.net](https://xunit.net/) ## License