Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Extend coproduct with extra dimension #170

Merged
merged 3 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v3

- name: Setup .NET 6
uses: actions/setup-dotnet@v3
- name: Setup .NET 8
uses: actions/setup-dotnet@v4
with:
dotnet-version: 6.0.x
dotnet-version: 8.0.x

- name: Clean
run: dotnet clean ./FuncSharp.sln --configuration $config && dotnet nuget locals all --clear
Expand All @@ -49,4 +49,4 @@ jobs:
name: Mews.FuncSharp Tests report
path: "**/test-results.trx"
reporter: dotnet-trx
fail-on-error: true
fail-on-error: true
213 changes: 212 additions & 1 deletion src/FuncSharp/Collections/IEnumerableExtensions_Coproducts.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

using System;
using System.Collections.Generic;

Expand Down Expand Up @@ -2550,4 +2549,216 @@ public static (IReadOnlyList<T1>, IReadOnlyList<T2>, IReadOnlyList<T3>, IReadOnl

return (list1, list2, list3, list4, list5, list6, list7, list8, list9, list10, list11, list12, list13, list14, list15, list16, list17, list18, list19, list20);
}

/// <summary>
/// For each partition (collection of n-th coproduct elements), invokes the specified function.
/// </summary>
public static void PartitionMatch<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(
this IEnumerable<ICoproduct21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> source,
Action<IReadOnlyList<T1>> f1,
Action<IReadOnlyList<T2>> f2,
Action<IReadOnlyList<T3>> f3,
Action<IReadOnlyList<T4>> f4,
Action<IReadOnlyList<T5>> f5,
Action<IReadOnlyList<T6>> f6,
Action<IReadOnlyList<T7>> f7,
Action<IReadOnlyList<T8>> f8,
Action<IReadOnlyList<T9>> f9,
Action<IReadOnlyList<T10>> f10,
Action<IReadOnlyList<T11>> f11,
Action<IReadOnlyList<T12>> f12,
Action<IReadOnlyList<T13>> f13,
Action<IReadOnlyList<T14>> f14,
Action<IReadOnlyList<T15>> f15,
Action<IReadOnlyList<T16>> f16,
Action<IReadOnlyList<T17>> f17,
Action<IReadOnlyList<T18>> f18,
Action<IReadOnlyList<T19>> f19,
Action<IReadOnlyList<T20>> f20,
Action<IReadOnlyList<T21>> f21)
{
var list1 = new List<T1>();
var list2 = new List<T2>();
var list3 = new List<T3>();
var list4 = new List<T4>();
var list5 = new List<T5>();
var list6 = new List<T6>();
var list7 = new List<T7>();
var list8 = new List<T8>();
var list9 = new List<T9>();
var list10 = new List<T10>();
var list11 = new List<T11>();
var list12 = new List<T12>();
var list13 = new List<T13>();
var list14 = new List<T14>();
var list15 = new List<T15>();
var list16 = new List<T16>();
var list17 = new List<T17>();
var list18 = new List<T18>();
var list19 = new List<T19>();
var list20 = new List<T20>();
var list21 = new List<T21>();

foreach (var c in source)
{
c.Match(
c1 => list1.Add(c1),
c2 => list2.Add(c2),
c3 => list3.Add(c3),
c4 => list4.Add(c4),
c5 => list5.Add(c5),
c6 => list6.Add(c6),
c7 => list7.Add(c7),
c8 => list8.Add(c8),
c9 => list9.Add(c9),
c10 => list10.Add(c10),
c11 => list11.Add(c11),
c12 => list12.Add(c12),
c13 => list13.Add(c13),
c14 => list14.Add(c14),
c15 => list15.Add(c15),
c16 => list16.Add(c16),
c17 => list17.Add(c17),
c18 => list18.Add(c18),
c19 => list19.Add(c19),
c20 => list20.Add(c20),
c21 => list21.Add(c21)
);
}

f1(list1);
f2(list2);
f3(list3);
f4(list4);
f5(list5);
f6(list6);
f7(list7);
f8(list8);
f9(list9);
f10(list10);
f11(list11);
f12(list12);
f13(list13);
f14(list14);
f15(list15);
f16(list16);
f17(list17);
f18(list18);
f19(list19);
f20(list20);
f21(list21);
}

/// <summary>
/// For each partition (collection of n-th coproduct elements), invokes the specified function, aggregates results and returns them.
/// </summary>
public static IReadOnlyList<TResult> PartitionMatch<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, TResult>(
this IEnumerable<ICoproduct21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> source,
Func<IReadOnlyList<T1>, IEnumerable<TResult>> f1,
Func<IReadOnlyList<T2>, IEnumerable<TResult>> f2,
Func<IReadOnlyList<T3>, IEnumerable<TResult>> f3,
Func<IReadOnlyList<T4>, IEnumerable<TResult>> f4,
Func<IReadOnlyList<T5>, IEnumerable<TResult>> f5,
Func<IReadOnlyList<T6>, IEnumerable<TResult>> f6,
Func<IReadOnlyList<T7>, IEnumerable<TResult>> f7,
Func<IReadOnlyList<T8>, IEnumerable<TResult>> f8,
Func<IReadOnlyList<T9>, IEnumerable<TResult>> f9,
Func<IReadOnlyList<T10>, IEnumerable<TResult>> f10,
Func<IReadOnlyList<T11>, IEnumerable<TResult>> f11,
Func<IReadOnlyList<T12>, IEnumerable<TResult>> f12,
Func<IReadOnlyList<T13>, IEnumerable<TResult>> f13,
Func<IReadOnlyList<T14>, IEnumerable<TResult>> f14,
Func<IReadOnlyList<T15>, IEnumerable<TResult>> f15,
Func<IReadOnlyList<T16>, IEnumerable<TResult>> f16,
Func<IReadOnlyList<T17>, IEnumerable<TResult>> f17,
Func<IReadOnlyList<T18>, IEnumerable<TResult>> f18,
Func<IReadOnlyList<T19>, IEnumerable<TResult>> f19,
Func<IReadOnlyList<T20>, IEnumerable<TResult>> f20,
Func<IReadOnlyList<T21>, IEnumerable<TResult>> f21)
{
var result = new List<TResult>();

source.PartitionMatch(
c1 => result.AddRange(f1(c1)),
c2 => result.AddRange(f2(c2)),
c3 => result.AddRange(f3(c3)),
c4 => result.AddRange(f4(c4)),
c5 => result.AddRange(f5(c5)),
c6 => result.AddRange(f6(c6)),
c7 => result.AddRange(f7(c7)),
c8 => result.AddRange(f8(c8)),
c9 => result.AddRange(f9(c9)),
c10 => result.AddRange(f10(c10)),
c11 => result.AddRange(f11(c11)),
c12 => result.AddRange(f12(c12)),
c13 => result.AddRange(f13(c13)),
c14 => result.AddRange(f14(c14)),
c15 => result.AddRange(f15(c15)),
c16 => result.AddRange(f16(c16)),
c17 => result.AddRange(f17(c17)),
c18 => result.AddRange(f18(c18)),
c19 => result.AddRange(f19(c19)),
c20 => result.AddRange(f20(c20)),
c21 => result.AddRange(f21(c21))
);

return result;
}

/// <summary>
/// Takes a collection of coproducts, partitions them into collections and returns those collections.
/// </summary>
public static (IReadOnlyList<T1>, IReadOnlyList<T2>, IReadOnlyList<T3>, IReadOnlyList<T4>, IReadOnlyList<T5>, IReadOnlyList<T6>, IReadOnlyList<T7>, IReadOnlyList<T8>, IReadOnlyList<T9>, IReadOnlyList<T10>, IReadOnlyList<T11>, IReadOnlyList<T12>, IReadOnlyList<T13>, IReadOnlyList<T14>, IReadOnlyList<T15>, IReadOnlyList<T16>, IReadOnlyList<T17>, IReadOnlyList<T18>, IReadOnlyList<T19>, IReadOnlyList<T20>, IReadOnlyList<T21>) Partition<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(this IEnumerable<ICoproduct21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>> source)
{
var list1 = new List<T1>();
var list2 = new List<T2>();
var list3 = new List<T3>();
var list4 = new List<T4>();
var list5 = new List<T5>();
var list6 = new List<T6>();
var list7 = new List<T7>();
var list8 = new List<T8>();
var list9 = new List<T9>();
var list10 = new List<T10>();
var list11 = new List<T11>();
var list12 = new List<T12>();
var list13 = new List<T13>();
var list14 = new List<T14>();
var list15 = new List<T15>();
var list16 = new List<T16>();
var list17 = new List<T17>();
var list18 = new List<T18>();
var list19 = new List<T19>();
var list20 = new List<T20>();
var list21 = new List<T21>();

foreach (var c in source)
{
c.Match(
c1 => list1.Add(c1),
c2 => list2.Add(c2),
c3 => list3.Add(c3),
c4 => list4.Add(c4),
c5 => list5.Add(c5),
c6 => list6.Add(c6),
c7 => list7.Add(c7),
c8 => list8.Add(c8),
c9 => list9.Add(c9),
c10 => list10.Add(c10),
c11 => list11.Add(c11),
c12 => list12.Add(c12),
c13 => list13.Add(c13),
c14 => list14.Add(c14),
c15 => list15.Add(c15),
c16 => list16.Add(c16),
c17 => list17.Add(c17),
c18 => list18.Add(c18),
c19 => list19.Add(c19),
c20 => list20.Add(c20),
c21 => list21.Add(c21)
);
}

return (list1, list2, list3, list4, list5, list6, list7, list8, list9, list10, list11, list12, list13, list14, list15, list16, list17, list18, list19, list20, list21);
}
}
Loading
Loading