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
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);
Maybe<Customer> customerOrNothing = _customerRepository.GetById(id); if (customerOrNothing.HasNoValue) return Error("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") .OnSuccess(customer => customer.Promote()) .OnSuccess(customer => _emailGateway.SendPromotionNotification(customer.PrimaryEmail, customer.Status)) .OnBoth(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") .OnSuccessWithTransactionScope(customer => Result.Ok(customer) .OnSuccess(customer => customer.Promote()) .OnSuccess(customer => customer.ClearAppointments())) .OnSuccess(customer => _emailGateway.SendPromotionNotification(customer.PrimaryEmail, customer.Status)) .OnBoth(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!