Get Started
UnambitiousFx.Functional is a lightweight functional programming toolkit for .NET.
It gives you core building blocks for explicit, composable workflows:
Result/Result<T>for explicit success-failure flows.Maybe<T>for optional values without null checks everywhere.
Packages
dotnet add package UnambitiousFx.Functional
For web APIs:
dotnet add package UnambitiousFx.Functional.AspNetCore
For test assertions with xUnit:
dotnet add package UnambitiousFx.Functional.xunit
Quick Start
using UnambitiousFx.Functional;
using UnambitiousFx.Functional.Failures;
static Result<int> ParsePositiveInt(string input)
{
if (!int.TryParse(input, out var value))
return Result.Failure<int>(new ValidationFailure("Input is not a valid integer"));
if (value <= 0)
return Result.Failure<int>(new ValidationFailure("Value must be positive"));
return Result.Success(value);
}
var result = ParsePositiveInt("42")
.Map(value => value * 2)
.Ensure(value => value < 100, new ValidationFailure("Value must be less than 100"));
result.Match(
success: value => Console.WriteLine($"Success: {value}"),
failure: error => Console.WriteLine($"Failure: {error.Code} - {error.Message}")
);
Design Principles
- Errors are values, not exceptions used for control flow.
- Pipelines are composable through
Bind,Map,Ensure,Recover, andTap. - APIs are async-friendly with
TaskandValueTaskoverloads. - Domain intent is explicit in type signatures.
Next Steps
Follow this path from fundamentals to advanced integration:
- Read Migration from v1 if you are upgrading.
- Read Result for railway-oriented pipelines.
- Read Maybe for optional-value flows.
- Read Failures and Metadata for error modeling and contextual data.
- Read ASP.NET Core for HTTP mapping and web API integration.
- Read xUnit for assertion patterns in tests.