using System;
namespace S
{
public struct Option<T>
{
readonly bool isSome;
readonly T value;
private Option(T value)
{
this.value = value;
isSome = true;
}
/// <summary>
/// None--to-->Option
/// </summary>
/// <param name="none"></param>
public static implicit operator Option<T>(Maybe.None none) =>
new Option<T>();
/// <summary>
/// Some--to-->Option
/// </summary>
/// <param name="some"></param>
public static implicit operator Option<T>(Maybe.Some<T> some) =>
new Option<T>(some.Value);
/// <summary>
/// value--to-->Option
/// </summary>
/// <param name="value"></param>
public static implicit operator Option<T>(T value) =>
value == null ? F.None : F.Some(value);
public R Match<R>(Func<R> None, Func<T, R> Some) =>
isSome ? Some(value) : None();
}
public static class F
{
public static Maybe.None None => Maybe.None.Default;
//public static Maybe.Some<T> Some<T>(T value) => new Maybe.Some<T>(value);
public static Option<T> Some<T>(T value) => new Maybe.Some<T>(value);
}
public static class Maybe
{
public struct None
{
internal static readonly None Default = new None();
}
public struct Some<T>
{
internal T Value { get; }
internal Some(T value)
{
if (value == null) throw new ArgumentNullException();
Value = value;
}
}
}
}
C# FP Maybe
最新推荐文章于 2021-12-05 22:31:02 发布