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.
Available on nuget
PM> Install-Package CSharpFunctionalExtensions
.NET 4.0 version is available as a separate package on nuget
PM> Install-Package CSharpFunctionalExtensionsNet4.0
Result<CustomerName>name=CustomerName.Create(model.Name);Result<Email>email=Email.Create(model.PrimaryEmail);Resultresult=Result.Combine(name,email);if(result.IsFailure)returnError(result.Error);varcustomer=newCustomer(name.Value,email.Value);Maybe<Customer>customerOrNothing=_customerRepository.GetById(id);if(customerOrNothing.HasNoValue)returnError("Customer with such Id is not found: "+id);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));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));- Functional C#: Primitive obsession
- Functional C#: Non-nullable reference types
- Functional C#: Handling failures, input errors
- Applying Functional Principles in C# Pluralsight course
A big thanks to the project contributors!
- 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