Skip to main content

Dusharp by Vitali

NuGet / site data​

Nuget GitHub last commit GitHub Repo stars

Details​

Info​

info

Name: Dusharp

Dusharp is a C# source generator for creating discriminated unions.

Author: Vitali

NuGet: https://www.nuget.org/packages/Dusharp/

You can find more details at https://github.com/kolebynov/Dusharp

Source: https://github.com/kolebynov/Dusharp

Original Readme​

note

Dusharp

NuGet

Dusharp is a C# source generator library for creating discriminated unions. This library allows you to define union types with ease, using attributes and partial methods. It is inspired by functional languages but built for C# developers.

Features​

  • ✅ Create unions: Define discriminated unions using attributes.
  • ✅ Match method: Pattern match on union cases in a type-safe way.
  • ✅ Equality: Automatic equality comparison for unions.
  • ✅ Generics: Generics support for union types.
  • ✅ Pretty print: Using overloaded ToString().
  • ❌ JSON serialization/deserialization: Support for unions with System.Text.Json (coming soon).
  • ❌ Struct unions: With efficient memory layout for unions as structs (coming soon).

Installation​

Dusharp is available as a NuGet package. You can install it using the NuGet package manager:

dotnet add package Dusharp

Usage​

Dusharp uses attributes to generate discriminated unions and case methods. Here's how to get started:

1. Define a Union​

To define a union, annotate a class with the [Dusharp.UnionAttribute] attribute.

using Dusharp;

[Union]
public partial class Shape<T>
where T : struct, INumber<T>
{
}

2. Define Union Cases​

Define union cases by creating public static partial methods and marking them with the [Dusharp.UnionCaseAttribute] attribute. The method body will be automatically generated.

using Dusharp;

[Union]
public partial class Shape<T>
where T : struct, INumber<T>
{
[UnionCase]
public static partial Shape<T> Circle(T radius);

[UnionCase]
public static partial Shape<T> Rectangle(T width, T height);
}

3. Match on Union​

You can easily perform pattern matching on a union using the Match method. The source generator will create the Match method based on the defined union cases.

Shape<double> shape = Shape<double>.Circle(5.0);

string result = shape.Match(
radius => $"Circle with radius {radius}",
(width, height) => $"Rectangle with width {width} and height {height}");

Console.WriteLine(result); // Output: Circle with radius 5.0

4. Compare Unions​

Union cases can be compared for equality using the auto-generated equality methods. This allows for checking if two unions are the same.

Shape<double> shape1 = Shape<double>.Circle(5.0);
Shape<double> shape2 = Shape<double>.Circle(5.0);

Console.WriteLine(shape1.Equals(shape2)); // True
Console.WriteLine(shape1 == shape2); // True

Upcoming Features​

  • JSON serialization/deserialization: Support for JSON (de)serialization via System.Text.Json.
  • Struct unions: More efficient unions using structs with effective data layout.

License​

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

About​

note

Generate tagged union

How to use​

Example (source csproj, source files)​

This is the CSharp Project that references Dusharp

<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<PropertyGroup>
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
<CompilerGeneratedFilesOutputPath>$(BaseIntermediateOutputPath)\GX</CompilerGeneratedFilesOutputPath>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Dusharp" Version="0.4.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>



</Project>

Generated Files​

Those are taken from $(BaseIntermediateOutputPath)\GX

// <auto-generated> This file has been auto generated. </auto-generated>
#nullable enable
using System;
using System.Runtime.CompilerServices;

namespace Dusharp
{
public static class ExceptionUtils
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void ThrowIfNull<T>(this T value, string paramName)
where T : class
{
if (value == null)
{
ThrowArgumentNull(paramName);
}
}

[MethodImpl(MethodImplOptions.NoInlining)]
public static void ThrowUnionInInvalidState() =>
throw new InvalidOperationException("Union in invalid state.");

[MethodImpl(MethodImplOptions.NoInlining)]
private static void ThrowArgumentNull(string paramName) => throw new ArgumentNullException(paramName);
}
}

Useful​

Download Example (.NET C#)​

Share Dusharp​

https://ignatandrei.github.io/RSCG_Examples/v2/docs/Dusharp

aaa

Category "FunctionalProgramming" has the following generators:​

1 cachesourcegenerator Nuget GitHub Repo stars 2024-02-14

2 dunet Nuget GitHub Repo stars 2023-04-16

3 Dusharp Nuget GitHub Repo stars 2024-09-19

4 Funcky.DiscriminatedUnion Nuget GitHub Repo stars 2024-01-18

5 FunicularSwitch NugetNuget GitHub Repo stars 2024-02-12

6 N.SourceGenerators.UnionTypes Nuget GitHub Repo stars 2023-10-29

7 OneOf NugetNuget GitHub Repo stars 2023-08-21

8 PartiallyApplied Nuget GitHub Repo stars 2023-04-16

9 polytype Nuget GitHub Repo stars 2024-11-04

10 rscg_demeter Nuget GitHub Repo stars 2025-03-26

11 rscg_queryables NugetNuget GitHub Repo stars 2024-11-02

12 RSCG_Utils_Memo Nuget GitHub Repo stars 2023-08-27

13 ScottEncodingGenerator Nuget GitHub Repo stars 2026-06-30

14 Sera.Union Nuget GitHub Repo stars 2024-08-26

15 Sundew.DiscriminatedUnions Nuget GitHub Repo stars 2026-02-14

16 TypeUtilities Nuget GitHub Repo stars 2024-03-05

17 UnionGen Nuget GitHub Repo stars 2024-04-05

18 UnionsGenerator Nuget GitHub Repo stars 2024-02-18

See category​

FunctionalProgramming