From eec4cbc3b6f0f0a865ec7f9342fdc36cc1ff58f7 Mon Sep 17 00:00:00 2001 From: Sanchime Date: Sat, 14 May 2022 10:53:03 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=85=A8=E5=B1=80=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E7=A9=BA=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sanchime.Functional/Extensions/Action.cs | 2 -- Sanchime.Functional/Extensions/Dictionary.cs | 2 -- Sanchime.Functional/Extensions/Either.cs | 2 -- Sanchime.Functional/Extensions/Enum.cs | 2 -- Sanchime.Functional/Extensions/Exceptional.cs | 27 ++++++++++++++++--- Sanchime.Functional/Extensions/Func.cs | 1 - Sanchime.Functional/Extensions/GlobalUsing.cs | 3 +++ Sanchime.Functional/Extensions/IEnumerable.cs | 1 - Sanchime.Functional/Extensions/Identity.cs | 2 -- Sanchime.Functional/Extensions/Nullable.cs | 2 -- Sanchime.Functional/Extensions/Option.cs | 2 -- Sanchime.Functional/Extensions/Task.cs | 4 --- Sanchime.Functional/Products/Exceptional.cs | 14 +++++----- 13 files changed, 34 insertions(+), 30 deletions(-) create mode 100644 Sanchime.Functional/Extensions/GlobalUsing.cs diff --git a/Sanchime.Functional/Extensions/Action.cs b/Sanchime.Functional/Extensions/Action.cs index 53c4d9e..2d7e30e 100644 --- a/Sanchime.Functional/Extensions/Action.cs +++ b/Sanchime.Functional/Extensions/Action.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class ActionExtension diff --git a/Sanchime.Functional/Extensions/Dictionary.cs b/Sanchime.Functional/Extensions/Dictionary.cs index dac608d..4c09738 100644 --- a/Sanchime.Functional/Extensions/Dictionary.cs +++ b/Sanchime.Functional/Extensions/Dictionary.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; /// diff --git a/Sanchime.Functional/Extensions/Either.cs b/Sanchime.Functional/Extensions/Either.cs index bbd27c0..e9faa77 100644 --- a/Sanchime.Functional/Extensions/Either.cs +++ b/Sanchime.Functional/Extensions/Either.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class EitherExtension diff --git a/Sanchime.Functional/Extensions/Enum.cs b/Sanchime.Functional/Extensions/Enum.cs index dc3a87d..28fd95d 100644 --- a/Sanchime.Functional/Extensions/Enum.cs +++ b/Sanchime.Functional/Extensions/Enum.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class EnumExtension diff --git a/Sanchime.Functional/Extensions/Exceptional.cs b/Sanchime.Functional/Extensions/Exceptional.cs index 27631c4..3a73c03 100644 --- a/Sanchime.Functional/Extensions/Exceptional.cs +++ b/Sanchime.Functional/Extensions/Exceptional.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; /// @@ -10,6 +8,29 @@ public static class ExceptionalException public static Func> Return() => val => val; + public static Unit Match(this Exceptional @this, Action Exception, Action Success) + => @this.Match(Exception.ToFunc(), Success.ToFunc()); + + #region 函子 + + public static Exceptional Map(this Exceptional @this, Func mapping) + => @this.Successful ? mapping(@this.Value) : new Exceptional(@this.Exception); + + #endregion + + #region 应用式 + + public static Exceptional Apply(this Exceptional> @this, Exceptional value) + => @this.Match( + Exception: e => e, + Success: apply => value.Match( + Exception: e => e, + Success: val => new Exceptional(apply(val)) + ) + ); - + public static Exceptional> Apply(this Exceptional> @this, Exceptional value) + => @this.Map(CurryingExtension.Curry).Apply(value); + #endregion + } diff --git a/Sanchime.Functional/Extensions/Func.cs b/Sanchime.Functional/Extensions/Func.cs index c4de00e..14197a8 100644 --- a/Sanchime.Functional/Extensions/Func.cs +++ b/Sanchime.Functional/Extensions/Func.cs @@ -1,4 +1,3 @@ -using Sanchime.Functional.Products; namespace Sanchime.Functional.Extensions; public static class FuncExtension diff --git a/Sanchime.Functional/Extensions/GlobalUsing.cs b/Sanchime.Functional/Extensions/GlobalUsing.cs new file mode 100644 index 0000000..72bbbe4 --- /dev/null +++ b/Sanchime.Functional/Extensions/GlobalUsing.cs @@ -0,0 +1,3 @@ +global using Sanchime.Functional.Products; + +namespace Sanchime.Functional.Extensions; diff --git a/Sanchime.Functional/Extensions/IEnumerable.cs b/Sanchime.Functional/Extensions/IEnumerable.cs index ccb30dc..2400e68 100644 --- a/Sanchime.Functional/Extensions/IEnumerable.cs +++ b/Sanchime.Functional/Extensions/IEnumerable.cs @@ -1,5 +1,4 @@ using System.Collections.Immutable; -using Sanchime.Functional.Products; namespace Sanchime.Functional.Extensions; diff --git a/Sanchime.Functional/Extensions/Identity.cs b/Sanchime.Functional/Extensions/Identity.cs index 9e6a6cc..bd75713 100644 --- a/Sanchime.Functional/Extensions/Identity.cs +++ b/Sanchime.Functional/Extensions/Identity.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class IdentityExtension diff --git a/Sanchime.Functional/Extensions/Nullable.cs b/Sanchime.Functional/Extensions/Nullable.cs index 64083e0..9ff820f 100644 --- a/Sanchime.Functional/Extensions/Nullable.cs +++ b/Sanchime.Functional/Extensions/Nullable.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class NullableExtension diff --git a/Sanchime.Functional/Extensions/Option.cs b/Sanchime.Functional/Extensions/Option.cs index 190ceaf..add671c 100644 --- a/Sanchime.Functional/Extensions/Option.cs +++ b/Sanchime.Functional/Extensions/Option.cs @@ -1,5 +1,3 @@ -using Sanchime.Functional.Products; - namespace Sanchime.Functional.Extensions; public static class OptionExtension diff --git a/Sanchime.Functional/Extensions/Task.cs b/Sanchime.Functional/Extensions/Task.cs index 2adbccd..d95595f 100644 --- a/Sanchime.Functional/Extensions/Task.cs +++ b/Sanchime.Functional/Extensions/Task.cs @@ -1,7 +1,3 @@ -using System.Collections.Generic; -using System; -using System.Threading.Tasks; -using Sanchime.Functional.Products; namespace Sanchime.Functional.Extensions; public static class TaskExtension diff --git a/Sanchime.Functional/Products/Exceptional.cs b/Sanchime.Functional/Products/Exceptional.cs index 4dd4f7a..40e1536 100644 --- a/Sanchime.Functional/Products/Exceptional.cs +++ b/Sanchime.Functional/Products/Exceptional.cs @@ -2,13 +2,13 @@ namespace Sanchime.Functional.Products; public readonly struct Exceptional { - internal Exception _exception { get; } + internal Exception Exception { get; } - internal TValue _value { get; } + internal TValue Value { get; } - public bool Success => _exception is null; + public bool Successful => Exception is null; - public bool Exception => !Success; + public bool Exceptionally => !Successful; internal Exceptional(Exception exception) { @@ -16,11 +16,11 @@ public readonly struct Exceptional { throw new ArgumentNullException(nameof(exception)); } - (_exception, _value) = (exception, default!); + (Exception, Value) = (exception, default!); } internal Exceptional(TValue right) - => (_value, _exception) = (right, default!); + => (Value, Exception) = (right, default!); public static implicit operator Exceptional(Exception left) => new(left); @@ -29,7 +29,7 @@ public readonly struct Exceptional => new(right); public TRight Match(Func Exception, Func Success) - => this.Exception ? Exception(_exception) : Success(_value); + => Exceptionally ? Exception(this.Exception) : Success(Value); public override string ToString() => Match(e => $"Exception({e.Message})", v => $"Success({v})");