MonadicSharp 1.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package MonadicSharp --version 1.0.0
                    
NuGet\Install-Package MonadicSharp -Version 1.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MonadicSharp" Version="1.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MonadicSharp" Version="1.0.0" />
                    
Directory.Packages.props
<PackageReference Include="MonadicSharp" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MonadicSharp --version 1.0.0
                    
#r "nuget: MonadicSharp, 1.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MonadicSharp@1.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MonadicSharp&version=1.0.0
                    
Install as a Cake Addin
#tool nuget:?package=MonadicSharp&version=1.0.0
                    
Install as a Cake Tool

MonadicSharp

NuGet Version NuGet Downloads

A modern functional programming library for C# featuring Result<T>, Option<T>, Railway-Oriented Programming, and fluent pipeline composition. Build robust applications with elegant error handling and monadic patterns.

✨ Features

  • 🚦 Result<T> - Railway-oriented programming for error handling
  • 🎯 Option<T> - Null-safe operations and optional values
  • 🔄 Fluent Pipelines - Chain operations with elegant syntax
  • Async Support - Full async/await compatibility
  • 🛡️ Type Safety - Leverage C#'s type system for bulletproof code
  • 📦 Zero Dependencies - Lightweight and self-contained

🚀 Quick Start

Installation

dotnet add package MonadicSharp

Basic Usage

using MonadicSharp;
using MonadicSharp.Extensions;

// Result<T> for error handling
var result = Result.Success(42)
    .Map(x => x * 2)
    .Bind(x => x > 50 ? Result.Success(x) : Result.Failure("Too small"))
    .Map(x => $"Final value: {x}");

result.Match(
    onSuccess: value => Console.WriteLine(value),
    onFailure: error => Console.WriteLine($"Error: {error}")
);

// Option<T> for null-safe operations
var user = GetUser()
    .Map(u => u.Email)
    .Filter(email => email.Contains("@"))
    .GetValueOrDefault("no-email@example.com");

🔧 Core Types

Result<T>

Railway-oriented programming for elegant error handling:

// Success path
var success = Result.Success("Hello World");

// Failure path
var failure = Result.Failure<string>("Something went wrong");

// Chaining operations
var result = GetUser(id)
    .Bind(ValidateUser)
    .Bind(SaveUser)
    .Map(u => u.Id);

Option<T>

Null-safe operations without null reference exceptions:

// Some value
var some = Option.Some(42);

// No value
var none = Option.None<int>();

// Safe operations
var result = GetUser()
    .Map(u => u.Name)
    .Filter(name => name.Length > 0)
    .GetValueOrDefault("Anonymous");

🔄 Pipeline Composition

Build complex data processing pipelines:

var pipeline = Pipeline
    .Start<string>()
    .Then(ParseNumber)
    .Then(ValidateRange)
    .Then(FormatOutput);

var result = await pipeline.ExecuteAsync("42");

🎯 Error Handling Patterns

Traditional Approach (Problematic)

public User GetUser(int id)
{
    var user = database.Find(id);
    if (user == null) 
        throw new UserNotFoundException();
    
    if (!user.IsActive)
        throw new UserInactiveException();
        
    return user;
}

MonadicSharp Approach (Clean)

public Result<User> GetUser(int id)
{
    return database.Find(id)
        .ToResult("User not found")
        .Bind(ValidateUserActive);
}

private Result<User> ValidateUserActive(User user)
{
    return user.IsActive 
        ? Result.Success(user)
        : Result.Failure("User is inactive");
}

📖 API Reference

Result<T> Methods

  • Success<T>(T value) - Create a successful result
  • Failure<T>(string error) - Create a failed result
  • Map<TResult>(Func<T, TResult> func) - Transform the success value
  • Bind<TResult>(Func<T, Result<TResult>> func) - Chain operations
  • Match<TResult>(Func<T, TResult> onSuccess, Func<string, TResult> onFailure) - Pattern match
  • IsSuccess - Check if result is successful
  • IsFailure - Check if result has failed
  • Value - Get the success value (throws if failed)
  • Error - Get the error message (empty if successful)

Option<T> Methods

  • Some<T>(T value) - Create an option with value
  • None<T>() - Create an empty option
  • Map<TResult>(Func<T, TResult> func) - Transform the value if present
  • Bind<TResult>(Func<T, Option<TResult>> func) - Chain operations
  • Filter(Func<T, bool> predicate) - Filter based on condition
  • Match<TResult>(Func<T, TResult> onSome, Func<TResult> onNone) - Pattern match
  • GetValueOrDefault(T defaultValue) - Get value or default
  • HasValue - Check if option has a value
  • Value - Get the value (throws if empty)

Extension Methods

// Convert nullable to Option
string? nullable = GetNullableString();
var option = nullable.ToOption();

// Convert to Result
var result = option.ToResult("Value was null");

// Async operations
var asyncResult = await GetUserAsync(id)
    .MapAsync(user => user.Email)
    .BindAsync(ValidateEmailAsync);

🏗️ Requirements

  • .NET 8.0 or later
  • C# 10.0 or later

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🤝 Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

📚 Learn More


Made with ❤️ by Danny4897

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (2)

Showing the top 2 NuGet packages that depend on MonadicSharp:

Package Downloads
MonadicSharp.AutoMapper

Lightweight, functional-friendly object mapper for MonadicSharp. Provides mapping configuration and extensions for Option, Result, and Either.

MonadicSharp.DI

MonadicSharp.DI - lightweight private mediator (in-process) aligned with MonadicSharp functional primitives (Result, Option, etc.).

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.3.5 217 10/8/2025
1.3.4 167 10/8/2025
1.3.3 176 6/26/2025
1.3.0 342 6/12/2025
1.2.0 321 6/10/2025
1.1.0 310 6/9/2025
1.0.0 156 6/7/2025