Functional Extensions for C#
This library helps write code in more functional way. To get to know more about the principles behind it, check out the Applying Functional Principles in C# Pluralsight course.
Installation
Available on nuget
PM> Install-Package CSharpFunctionalExtensions
.NET 4.0 version Installation
.NET 4.0 version is available as a separate package on nuget
PM> Install-Package CSharpFunctionalExtensionsNet4.0
Get rid of primitive obsession
Result<CustomerName> name = CustomerName.Create(model.Name); Result<Email> email = Email.Create(model.PrimaryEmail); Result result = Result.Combine(name, email); if (result.IsFailure) return Error(result.Error); var customer = new Customer(name.Value, email.Value);
Make nulls explicit with the Maybe type
Maybe<Customer> customerOrNothing = _customerRepository.GetById(id); if (customerOrNothing.HasNoValue) return Error("Customer with such Id is not found: " + id);
Compose multiple operations in a single chain
return _customerRepository.GetById(id) .ToResult("Customer with such Id is not found: " + id) .Ensure(customer => customer.CanBePromoted(), "The customer has the highest status possible") .Tap(customer => customer.Promote()) .Tap(customer => _emailGateway.SendPromotionNotification(customer.PrimaryEmail, customer.Status)) .Finally(result => result.IsSuccess ? Ok() : Error(result.Error));
Wrap multiple operations in a TransactionScope
return _customerRepository.GetById(id) .ToResult("Customer with such Id is not found: " + id) .Ensure(customer => customer.CanBePromoted(), "The customer has the highest status possible") .WithTransactionScope(customer => Result.Success(customer) .Tap(customer => customer.Promote()) .Tap(customer => customer.ClearAppointments())) .Tap(customer => _emailGateway.SendPromotionNotification(customer.PrimaryEmail, customer.Status)) .Finally(result => result.IsSuccess ? Ok() : Error(result.Error));
Readings and watchings
- Functional C#: Primitive obsession
- Functional C#: Non-nullable reference types
- Functional C#: Handling failures, input errors
- Applying Functional Principles in C# Pluralsight course
Contributors
A big thanks to the project contributors!
- Vadim Mingazhev
- Darick Carpenter
- Stéphane Mitermite
- Markus Nißl
- Adrian Frielinghaus
- svroonland
- JvSSD
- mnissl
- Vladimir Makaev
- Ben Smith
- pedromtcosta
- Michał Bator
- mukmyash
- azm102
- ThomasDC
- bopazyn
- Joris Goovaerts
- Ivan Deev
- Damian Płaza
- ergwun
- Michael DiLeo
- Jean-Claude
- Matt Jenkins
- Michael Altmann
- Steven Giesel
- Anton Hryshchanka
- Mikhail Bashurov
- kostekk88
- Carl Abrahams
- golavr
- Sviataslau Hankovich
- Chad Gilbert
- Robert Sęk
- Sergey Solomentsev
- Malcolm J Harwood
- Dragan Stepanovic
- Ivan Novikov
- Denis Molokanov
- Gerald Wiltse
- yakimovim
- Alex Erygin
- Omar Aloraini