From 27978f8d3297d6fa7011a8eaee69676cdc51e424 Mon Sep 17 00:00:00 2001 From: sanchime Date: Sun, 15 Jan 2023 21:50:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Sanchime.Functional.Test/OptionTest.cs | 33 +++++ .../Sanchime.Functional.Test.csproj | 26 ++++ Sanchime.Functional.Test/Usings.cs | 1 + Sanchime.Functional/Extensions/Enum.cs | 2 +- Sanchime.Functional/Extensions/GlobalUsing.cs | 2 - Sanchime.Functional/Products/Coyo.cs | 10 +- Sanchime.Functional/Products/Options/None.cs | 8 +- Sanchime.Functional/Products/Unit.cs | 9 +- Sanchime.Test/Program.cs | 124 +++++++++--------- Sanchime.sln | 12 +- Sanchime.sln.DotSettings.user | 3 + 11 files changed, 145 insertions(+), 85 deletions(-) create mode 100644 Sanchime.Functional.Test/OptionTest.cs create mode 100644 Sanchime.Functional.Test/Sanchime.Functional.Test.csproj create mode 100644 Sanchime.Functional.Test/Usings.cs diff --git a/Sanchime.Functional.Test/OptionTest.cs b/Sanchime.Functional.Test/OptionTest.cs new file mode 100644 index 0000000..538bbee --- /dev/null +++ b/Sanchime.Functional.Test/OptionTest.cs @@ -0,0 +1,33 @@ +using Sanchime.Functional.Products; +using Sanchime.Toolkits; +using static Sanchime.Functional.Products.Optional; +namespace Sanchime.Functional.Test; + +public class Tests +{ + [SetUp] + public void Setup() + { + } + + [Test] + public void OptionNone() + { + var foo = (Option o) => o; + + var result = foo(Optional.None); + + Assert.AreEqual(result, Optional.None); + } + + [Test] + [TestCase(-1)] + [TestCase(0)] + [TestCase(1)] + [TestCase(null)] + public void OptionMap(int? value) + { + var result = Some(value).Map(x => x * 10); + Assert.AreEqual(result, Some(value * 10)); + } +} \ No newline at end of file diff --git a/Sanchime.Functional.Test/Sanchime.Functional.Test.csproj b/Sanchime.Functional.Test/Sanchime.Functional.Test.csproj new file mode 100644 index 0000000..b90db44 --- /dev/null +++ b/Sanchime.Functional.Test/Sanchime.Functional.Test.csproj @@ -0,0 +1,26 @@ + + + + net7.0 + enable + enable + + false + + Sanchime.Funtional.Test + + + + + + + + + + + + + + + + diff --git a/Sanchime.Functional.Test/Usings.cs b/Sanchime.Functional.Test/Usings.cs new file mode 100644 index 0000000..cefced4 --- /dev/null +++ b/Sanchime.Functional.Test/Usings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file diff --git a/Sanchime.Functional/Extensions/Enum.cs b/Sanchime.Functional/Extensions/Enum.cs index d06babc..ecc1d8c 100644 --- a/Sanchime.Functional/Extensions/Enum.cs +++ b/Sanchime.Functional/Extensions/Enum.cs @@ -3,7 +3,7 @@ namespace Sanchime.Functional.Extensions; public static class EnumExtension { /// - /// 将字符串转换为相应的枚举值的 /// public static Option Parse(this string @this) where T : struct => Enum.TryParse(@this, out T val) ? Optional.Some(val) : Optional.None; diff --git a/Sanchime.Functional/Extensions/GlobalUsing.cs b/Sanchime.Functional/Extensions/GlobalUsing.cs index 72bbbe4..86bcbb9 100644 --- a/Sanchime.Functional/Extensions/GlobalUsing.cs +++ b/Sanchime.Functional/Extensions/GlobalUsing.cs @@ -1,3 +1 @@ global using Sanchime.Functional.Products; - -namespace Sanchime.Functional.Extensions; diff --git a/Sanchime.Functional/Products/Coyo.cs b/Sanchime.Functional/Products/Coyo.cs index c46971f..601767e 100644 --- a/Sanchime.Functional/Products/Coyo.cs +++ b/Sanchime.Functional/Products/Coyo.cs @@ -1,14 +1,6 @@ namespace Sanchime.Functional.Products; -public readonly struct Coyo -{ - public V Value {get;} - - public Func Func { get; } - - public Coyo(V value, Func func) - => (Value, Func) = (value, func); -} +public record struct Coyo(V Value, Func Func); public static class Coyo { diff --git a/Sanchime.Functional/Products/Options/None.cs b/Sanchime.Functional/Products/Options/None.cs index a2e4887..7c1e1b6 100644 --- a/Sanchime.Functional/Products/Options/None.cs +++ b/Sanchime.Functional/Products/Options/None.cs @@ -5,11 +5,9 @@ namespace Sanchime.Functional.Products; /// public readonly partial struct None : IOption { - public None() - { - - } + private static readonly Unit _value = Unit.Value; + static None() { } public bool IsSome => false; internal static readonly None Default = new(); - public Unit Value { get; } = Unit.Value; + public Unit Value => _value; } diff --git a/Sanchime.Functional/Products/Unit.cs b/Sanchime.Functional/Products/Unit.cs index d6bdd6e..95915d7 100644 --- a/Sanchime.Functional/Products/Unit.cs +++ b/Sanchime.Functional/Products/Unit.cs @@ -1,6 +1,6 @@ namespace Sanchime.Functional.Products; -public sealed class Unit +public sealed class Unit : IEquatable { private static readonly Unit _unique = new(); @@ -10,6 +10,11 @@ public sealed class Unit static Unit() { } public override int GetHashCode() => 0; - public override bool Equals(object? obj) => this == obj; + public override bool Equals(object? obj) + { + return ReferenceEquals(this, obj) || obj is Unit other && Equals(other); + } + public override string ToString() => "()"; + public bool Equals(Unit? other) => other != null; } diff --git a/Sanchime.Test/Program.cs b/Sanchime.Test/Program.cs index 4f8fe00..71d7e42 100644 --- a/Sanchime.Test/Program.cs +++ b/Sanchime.Test/Program.cs @@ -3,64 +3,68 @@ using Sanchime.Functional.Extensions; using Sanchime.Toolkits; -try -{ - void foo(Option option) - { - var res = option.Map(x => x + 2); - res.WriteLine(); - } - "预计打印Some(12)".WriteLine(); - foo(10); - "预计打印None".WriteLine(); - foo(Optional.None); - - "预计打印Some(String)".WriteLine(); - Optional.Some(1) - .Map(x => x + 1.2) - .Map(x => x.ToString()) - .Map(x => x.GetType().Name) - .WriteLine(); - -// 测试Option的Bind - var parse = (string s) => Int32.TryParse(s, out int i) ? Optional.Some(i) : Optional.None; - var foo1 = (string s) => s.Pipe(parse).Bind(Age.Of); - "预计打印Some(111)".WriteLine(); - foo1("111").WriteLine(); - "预计打印None".WriteLine(); - foo1("aaa").WriteLine(); - "预计打印Some(123)".WriteLine(); - foo1("123").WriteLine(); -// 管道 - "预计打印None".WriteLine(); - foo1("1ab").Pipe(x => x.WriteLine()); -} -catch (Exception ex) -{ - ex.Message.WriteLine(); - ex.StackTrace.WriteLine(); -} - -public struct Age -{ - private int _value; - - public static Option Of(int age) - => IsValid(age) ? Optional.Some(new Age(age)) : Optional.None; - - private Age(int age) - { - if (!IsValid(age)) - { - throw new ArgumentException("输入的年龄是无效的"); - } - _value = age; - } - - private static bool IsValid(int age) - => age is (>= 0 and <= 150); - - public override string ToString() - => _value.ToString(); -} +// try +// { +// void foo(Option option) +// { +// var res = option.Map(x => x + 2); +// res.WriteLine(); +// } +// +// "预计打印Some(12)".WriteLine(); +// foo(10); +// "预计打印None".WriteLine(); +// foo(Optional.None); +// +// "预计打印None".WriteLine(); +// Optional.Some(Optional.None).WriteLine(); +// +// "预计打印Some(String)".WriteLine(); +// Optional.Some(1) +// .Map(x => x + 1.2) +// .Map(x => x.ToString()) +// .Map(x => x.GetType().Name) +// .WriteLine(); +// +// // 测试Option的Bind +// var parse = (string s) => Int32.TryParse(s, out int i) ? Optional.Some(i) : Optional.None; +// var foo1 = (string s) => s.Pipe(parse).Bind(Age.Of); +// "预计打印Some(111)".WriteLine(); +// foo1("111").WriteLine(); +// "预计打印None".WriteLine(); +// foo1("aaa").WriteLine(); +// "预计打印Some(123)".WriteLine(); +// foo1("123").WriteLine(); +// // 管道 +// "预计打印None".WriteLine(); +// foo1("1ab").Pipe(x => x.WriteLine()); +// } +// catch (Exception ex) +// { +// ex.Message.WriteLine(); +// ex.StackTrace.WriteLine(); +// } +// +// public struct Age +// { +// private int _value; +// +// public static Option Of(int age) +// => IsValid(age) ? Optional.Some(new Age(age)) : Optional.None; +// +// private Age(int age) +// { +// if (!IsValid(age)) +// { +// throw new ArgumentException("输入的年龄是无效的"); +// } +// _value = age; +// } +// +// private static bool IsValid(int age) +// => age is (>= 0 and <= 150); +// +// public override string ToString() +// => _value.ToString(); +// } diff --git a/Sanchime.sln b/Sanchime.sln index 7052d2a..885edc6 100644 --- a/Sanchime.sln +++ b/Sanchime.sln @@ -3,12 +3,12 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanchime.Test", "Sanchime.Test\Sanchime.Test.csproj", "{852F212D-00AC-45B8-84FB-A97E0E711317}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanchime.Functional", "Sanchime.Functional\Sanchime.Functional.csproj", "{DF48AFE2-CD1B-4BCE-83EF-DA8BDA104069}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanchime.Toolkits", "Sanchime.Toolkits\Sanchime.Toolkits.csproj", "{3A94EB2F-04F1-46F8-ADD8-DE091402635F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sanchime.Functional.Test", "Sanchime.Functional.Test\Sanchime.Functional.Test.csproj", "{2D591AED-CDFD-4598-9826-F6BE7C65C39D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -18,10 +18,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {852F212D-00AC-45B8-84FB-A97E0E711317}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {852F212D-00AC-45B8-84FB-A97E0E711317}.Debug|Any CPU.Build.0 = Debug|Any CPU - {852F212D-00AC-45B8-84FB-A97E0E711317}.Release|Any CPU.ActiveCfg = Release|Any CPU - {852F212D-00AC-45B8-84FB-A97E0E711317}.Release|Any CPU.Build.0 = Release|Any CPU {DF48AFE2-CD1B-4BCE-83EF-DA8BDA104069}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DF48AFE2-CD1B-4BCE-83EF-DA8BDA104069}.Debug|Any CPU.Build.0 = Debug|Any CPU {DF48AFE2-CD1B-4BCE-83EF-DA8BDA104069}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -30,5 +26,9 @@ Global {3A94EB2F-04F1-46F8-ADD8-DE091402635F}.Debug|Any CPU.Build.0 = Debug|Any CPU {3A94EB2F-04F1-46F8-ADD8-DE091402635F}.Release|Any CPU.ActiveCfg = Release|Any CPU {3A94EB2F-04F1-46F8-ADD8-DE091402635F}.Release|Any CPU.Build.0 = Release|Any CPU + {2D591AED-CDFD-4598-9826-F6BE7C65C39D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D591AED-CDFD-4598-9826-F6BE7C65C39D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D591AED-CDFD-4598-9826-F6BE7C65C39D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D591AED-CDFD-4598-9826-F6BE7C65C39D}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal diff --git a/Sanchime.sln.DotSettings.user b/Sanchime.sln.DotSettings.user index 1460b21..1141528 100644 --- a/Sanchime.sln.DotSettings.user +++ b/Sanchime.sln.DotSettings.user @@ -1,2 +1,5 @@  + <SessionState ContinuousTestingMode="0" IsActive="True" Name="All tests from &lt;Sanchime.Funtional.Test&gt;" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <Project Location="/home/sanchime/Desktop/C#/Sanchime.Functional/Sanchime.Functional.Test" Presentation="&lt;Sanchime.Functional.Test&gt;" /> +</SessionState> True \ No newline at end of file