...
This commit is contained in:
48
Nub.Lang/Nub.Core/Optional.cs
Normal file
48
Nub.Lang/Nub.Core/Optional.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
|
namespace Nub.Core;
|
||||||
|
|
||||||
|
public readonly struct Optional
|
||||||
|
{
|
||||||
|
public static Optional<TValue> Empty<TValue>() => new();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Alias for creating an Optional<TValue> which allows for implicit types
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="value"></param>
|
||||||
|
/// <typeparam name="TValue"></typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static Optional<TValue> OfNullable<TValue>(TValue? value)
|
||||||
|
{
|
||||||
|
return value ?? Optional<TValue>.Empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public readonly struct Optional<TValue>
|
||||||
|
{
|
||||||
|
public static Optional<TValue> Empty() => new();
|
||||||
|
|
||||||
|
public static Optional<TValue> 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>(TValue value) => new(value);
|
||||||
|
}
|
||||||
49
Nub.Lang/Nub.Core/Variant.cs
Normal file
49
Nub.Lang/Nub.Core/Variant.cs
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
namespace Nub.Core;
|
||||||
|
|
||||||
|
public readonly struct Variant<T1, T2> 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<T1> on1, Action<T2> on2)
|
||||||
|
{
|
||||||
|
switch (_value)
|
||||||
|
{
|
||||||
|
case T1 v1:
|
||||||
|
on1(v1);
|
||||||
|
break;
|
||||||
|
case T2 v2:
|
||||||
|
on2(v2);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new InvalidCastException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T Match<T>(Func<T1, T> on1, Func<T2, T> on2)
|
||||||
|
{
|
||||||
|
return _value switch
|
||||||
|
{
|
||||||
|
T1 v1 => on1(v1),
|
||||||
|
T2 v2 => on2(v2),
|
||||||
|
_ => throw new InvalidCastException()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator Variant<T1, T2>(T1 value) => new(value);
|
||||||
|
public static implicit operator Variant<T1, T2>(T2 value) => new(value);
|
||||||
|
}
|
||||||
0
input/baseline/gc/gc.c
Normal file
0
input/baseline/gc/gc.c
Normal file
6
input/baseline/gc/gc.h
Normal file
6
input/baseline/gc/gc.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace DefaultNamespace;
|
||||||
|
|
||||||
|
public class gc_h
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user