Badeend.Result

For failures that are not exceptional: `Result<T,E>` for C#.


Keywords
csharp, error-handling, functional-programming, monad
License
MIT
Install
Install-Package Badeend.Result -Version 0.1.0

Documentation

Result

For failures that are not exceptional.

Nuget


This packages provides a Result<TValue, TFailure> type for C#, spiritually similar to those available in Rust, Swift, Kotlin, C++ and basically every functional programming language under the sun.

Results are commonly used in scenarios where failure is anticipated can be handled gracefully by the caller. Examples include:

  • Input validation,
  • Parsing and conversion,
  • Invocation of external services,
  • Authentication and authorization,
  • and more ...

Result<TValue, TFailure> represents the result of a fallible operation as a first class value. A result can be in one of two states: "success" or "failure". Both states have an associated payload of type TValue or TFailure respectively.


Documentation & more information at: https://badeend.github.io/Result/


Why does this package exist?

There are already dozens of similar packages. Yet, surprisingly, none of them provide what I'm looking for:

  • No opinion on what is allowed to be a failure. In other words: I want the failure type to be parameterized (TFailure) without constraints. IMO, hardcoding the failure type to e.g. Exception or string completely defeats the purpose of using a result type in C#.

  • Just Result, nothing else. I'm not interested in a complete Functional Programming framework that introduces 20-or-so new concepts, pushes all code into lambdas and attempts to redefine what it means to write C#. Not because I don't like FP, but because the language & ecosystem (sadly 🥲) doesn't afford it.

  • "Native" C#. It should feel as if it is written by C# developers, for C# developers, for use in (existing) C# codebases. Or put differently: if such a type were to be added to the BCL, how would Microsoft design it?


Shameless self-promotion

May I interest you in one of my other packages?

  • Badeend.ValueCollections: Low overhead immutable collection types with structural equality.
  • Badeend.EnumClass: Discriminated unions for C# with exhaustiveness checking.
  • Badeend.Result: For failures that are not exceptional: Result<T,E> for C#.
  • Badeend.Any: Holds any value of any type, without boxing small structs (up to 8 bytes).
  • Badeend.Nothing: If you want to use void as a type parameter, but C# won't let you.