Repository navigation
Umbrella: Funcky 4.0.0, The Closed Hierarchy Update #1035
Copy link
Copy link
Open
Labels
breaking changeThese are change in a way that is not API-compatibleThese are change in a way that is not API-compatible
Description
Umbrella for the 4.0.0 milestone, groomed on 29 Oct 2026. Funcky 4.0.0 redefines the monads on the .NET 11 type system (C# unions and closed hierarchies) and ships the breaking changes that 3.8.0 prepared with obsoletions and analyzer code fixes.
Release plan
Target date 10 November 2026, the .NET 11 release day; the first time Funcky ships close to a .NET release. 4.0.0 is not released before .NET 11 is available, and global.json moves from the release candidate to the GA SDK in the last PR before the tag. Packages: Funcky 4.0.0 | Funcky.Async 2.0.0 | Funcky.Xunit 3.0.0 | Funcky.Xunit.v3 2.0.0 | Funcky.Analyzers 3.0.0.
1. Mechanical breaking changes (no design dependency, start now)
- Build with the .NET 11 SDK and add the net11.0 asset #1031 Build with the .NET 11 SDK, add the net11.0 asset
- Drop the target frameworks announced in SupportPolicy.md (net7.0, net6.0, net5.0, netcoreapp3.1) #1032 Drop net7.0, net6.0, net5.0 and netcoreapp3.1
- Update Roslyn packages to their latest version #814 SDK baseline .NET 10, Roslyn 4.14 for generators and analyzers
- Remove Option.FromBoolean #901 Remove
Option.FromBoolean - Funcky.Async 2.0: require System.Linq.Async 7 and drop the pre-7 operator shims #925 + Remove the obsolete Await/AwaitWithCancellation async operators #981 Funcky.Async 2.0: System.Linq.Async 7 floor, remove the obsolete async operators (one PR)
- Parameter order of
Matchparameters is inconsistent #683Result.Match(error, ok) - 4.0.0: decide the fate of the classic forms behind λ1201–λ1203 and the rules' severity #1003 Remove
FunctionalAssertand theSequenceconstructors, keep thestringparse extensions; retire λ1202/λ1203 - Assertion failure label must become Assert.X() when FunctionalAssert is removed #1019 Failure label
Assert.X()(goes with 4.0.0: decide the fate of the classic forms behind λ1201–λ1203 and the rules' severity #1003) - Deprecate Funcky.DiscriminatedUnion with .NET11 #900 Retire Funcky.DiscriminatedUnion
2. Design spikes (time-boxed, same branch)
- Spike: model Option, Either and Result on C# unions and closed hierarchies #1034 Spike:
Option,Either,Resulton C# unions and closed hierarchies - Research the Type-Traits idea from lang-ext (HKT via static abstract) #862 Spike: higher-kinded traits via static abstract members (expected to be rejected, but worth seeing)
- Source generator for the monad cross products (Traverse/Sequence, Partition, Task binds, applicative lifting) #1036 Source generator for the monad cross products: the "else" branch if Research the Type-Traits idea from lang-ext (HKT via static abstract) #862 is rejected (Traverse/Sequence, Partition, Task binds, applicative lifting)
3. Design-dependent, after the spikes decide
- Simpler Monad Constructors #809 Simpler monad constructors
- collection expressions for Option<T> #760 Collection expressions for
Option<T> - Add extension versions of UpCast and DownCast #868 Extension versions of
UpCast/DownCast
4. New types and additive work
- Implement a Validation Applicative #802 Validation applicative (stays in 4.0.0: a big change to the type system, and the only applicative if traits land)
- Make Task a Monadic type #864
Taskas a monadic type (stays in 4.0.0 with the lowest priority; both may move to 4.1 if the date gets tight) - Support xUnit.v3 version 2, 3, and 4. #1015 xunit.v3 matrix leg for 2.x and 3.x
- Documentation: upgrade guide for 4.0.0 (and the older upgrades the book never got) #1033 Documentation: upgrade guide for 4.0.0 and the older upgrades
5. Release
-
global.jsonto the .NET 11 GA SDK, release prep PR (changelog fold, PublicAPI fold, versions), tag on the merge commit.
Decisions taken on 29 Oct 2026
- Classic forms (4.0.0: decide the fate of the classic forms behind λ1201–λ1203 and the rules' severity #1003):
FunctionalAssertandSequence.*go,string.Parse…OrNone()stays. No 3.9 release: the migration recipe is "fix-all on 3.8.0, then upgrade", documented in Documentation: upgrade guide for 4.0.0 (and the older upgrades the book never got) #1033. - The trait experiment (Research the Type-Traits idea from lang-ext (HKT via static abstract) #862) runs despite the recorded assessment, because 4.0.0 is the only moment it can be tried.
- Implement a Validation Applicative #802 and Make Task a Monadic type #864 stay in the milestone with the lowest priority.
Metadata
Metadata
Assignees
Labels
breaking changeThese are change in a way that is not API-compatibleThese are change in a way that is not API-compatible
Activity