From aa970f1abb872d9975e1600131c31e6fc09bf549 Mon Sep 17 00:00:00 2001 From: nub31 Date: Sat, 3 May 2025 16:14:26 +0200 Subject: [PATCH] ... --- Nub.Lang/Nub.Core/Optional.cs | 48 ++++++++++++++++++++++++++++++++++ Nub.Lang/Nub.Core/Variant.cs | 49 +++++++++++++++++++++++++++++++++++ input/baseline/gc/gc.c | 0 input/baseline/gc/gc.h | 6 +++++ 4 files changed, 103 insertions(+) create mode 100644 Nub.Lang/Nub.Core/Optional.cs create mode 100644 Nub.Lang/Nub.Core/Variant.cs create mode 100644 input/baseline/gc/gc.c create mode 100644 input/baseline/gc/gc.h diff --git a/Nub.Lang/Nub.Core/Optional.cs b/Nub.Lang/Nub.Core/Optional.cs new file mode 100644 index 0000000..8f7f1c1 --- /dev/null +++ b/Nub.Lang/Nub.Core/Optional.cs @@ -0,0 +1,48 @@ +using System.Diagnostics.CodeAnalysis; + +namespace Nub.Core; + +public readonly struct Optional +{ + public static Optional Empty() => new(); + + /// + /// Alias for creating an Optional<TValue> which allows for implicit types + /// + /// + /// + /// + public static Optional OfNullable(TValue? value) + { + return value ?? Optional.Empty(); + } +} + +public readonly struct Optional +{ + public static Optional Empty() => new(); + + public static Optional OfNullable(TValue? value) + { + return value ?? Empty(); + } + + public Optional() + { + Value = default; + HasValue = false; + } + + public Optional(TValue value) + { + Value = value; + HasValue = true; + } + + public TValue? Value { get; } + + [MemberNotNullWhen(true, nameof(Value))] + public bool HasValue { get; } + + public static implicit operator Optional(TValue value) => new(value); +} \ No newline at end of file diff --git a/Nub.Lang/Nub.Core/Variant.cs b/Nub.Lang/Nub.Core/Variant.cs new file mode 100644 index 0000000..8d38f9c --- /dev/null +++ b/Nub.Lang/Nub.Core/Variant.cs @@ -0,0 +1,49 @@ +namespace Nub.Core; + +public readonly struct Variant where T1 : notnull where T2 : notnull +{ + public Variant() + { + throw new InvalidOperationException("Variant must be initialized with a value"); + } + + public Variant(T1 value) + { + _value = value; + } + + public Variant(T2 value) + { + _value = value; + } + + private readonly object _value; + + public void Match(Action on1, Action on2) + { + switch (_value) + { + case T1 v1: + on1(v1); + break; + case T2 v2: + on2(v2); + break; + default: + throw new InvalidCastException(); + } + } + + public T Match(Func on1, Func on2) + { + return _value switch + { + T1 v1 => on1(v1), + T2 v2 => on2(v2), + _ => throw new InvalidCastException() + }; + } + + public static implicit operator Variant(T1 value) => new(value); + public static implicit operator Variant(T2 value) => new(value); +} \ No newline at end of file diff --git a/input/baseline/gc/gc.c b/input/baseline/gc/gc.c new file mode 100644 index 0000000..e69de29 diff --git a/input/baseline/gc/gc.h b/input/baseline/gc/gc.h new file mode 100644 index 0000000..c5db541 --- /dev/null +++ b/input/baseline/gc/gc.h @@ -0,0 +1,6 @@ +namespace DefaultNamespace; + +public class gc_h +{ + +} \ No newline at end of file