Skip to content
Functional extensions for C#
Branch: master
Clone or download
Latest commit 4d86c06 Apr 26, 2019

README.md

Functional Extensions for C#

Nuget downloads GitHub license

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")
    .OnSuccess(customer => customer.Promote())
    .OnSuccess(customer => _emailGateway.SendPromotionNotification(customer.PrimaryEmail, customer.Status))
    .OnBoth(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")
    .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));

Readings and watchings

Contributors

A big thanks to the project contributors!

You can’t perform that action at this time.