Skip to content

Commit

Permalink
Extend coproduct with extra dimension (#170)
Browse files Browse the repository at this point in the history
We need to add extra dimension as we now have coproduct of 21 items in
our code.
  • Loading branch information
DenysShylov authored Feb 3, 2025
2 parents 09e571a + 8972ce2 commit aa662eb
Show file tree
Hide file tree
Showing 6 changed files with 1,518 additions and 12 deletions.
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

0 comments on commit aa662eb

Please sign in to comment.