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);
}
}

Usefull

Download Example (.NET C# )

Share Dusharp

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

In the same category (FunctionalProgramming) - 12 other generators

cachesourcegenerator

dunet

Funcky.DiscriminatedUnion

FunicularSwitch

N.SourceGenerators.UnionTypes

OneOf

PartiallyApplied

RSCG_Utils_Memo

Sera.Union

TypeUtilities

UnionGen

UnionsGenerator