From 5e312a861a499d4ed2f8b56951ecba29f89d8fb1 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 15:52:01 -0700 Subject: [PATCH 1/6] Added passing true operator --- Application/iSynaptic.Commons/Maybe.cs | 10 ++++++++++ Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/Application/iSynaptic.Commons/Maybe.cs b/Application/iSynaptic.Commons/Maybe.cs index 0ef5d31..0703068 100644 --- a/Application/iSynaptic.Commons/Maybe.cs +++ b/Application/iSynaptic.Commons/Maybe.cs @@ -197,6 +197,16 @@ public static implicit operator Maybe(Maybe value) { return new Maybe(); } + + public static bool operator true(Maybe self) + { + return self.HasValue; + } + + public static bool operator false(Maybe self) + { + throw new NotImplementedException(); + } } public static class Maybe diff --git a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs index 69b502b..0416255 100644 --- a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs +++ b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs @@ -1270,6 +1270,16 @@ public void Squash_WithValue_ReturnsValue() Assert.AreEqual(42, result.Value); } + [Test] + public void BoolOperators_NonNullMabesAreTrue() + { + Maybe item = 7.ToMaybe(); + if(item) + Assert.Pass(); + else + Assert.Fail(); + } + public class Base{} public class Derived : Base{} } From 24fd4ec2ae9896b7f173d1c8342c760b92ab88f7 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 16:00:39 -0700 Subject: [PATCH 2/6] Added bool implicit convertion operator --- Application/iSynaptic.Commons/Maybe.cs | 5 +++++ Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/Application/iSynaptic.Commons/Maybe.cs b/Application/iSynaptic.Commons/Maybe.cs index 0703068..d95edf4 100644 --- a/Application/iSynaptic.Commons/Maybe.cs +++ b/Application/iSynaptic.Commons/Maybe.cs @@ -207,6 +207,11 @@ public static bool operator false(Maybe self) { throw new NotImplementedException(); } + + public static implicit operator bool(Maybe value) + { + return value.HasValue; + } } public static class Maybe diff --git a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs index 0416255..507c872 100644 --- a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs +++ b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs @@ -1280,6 +1280,16 @@ public void BoolOperators_NonNullMabesAreTrue() Assert.Fail(); } + [Test] + public void BoolOperators_NullMabesAreFalse() + { + var item = Maybe.NoValue; + if(!item) + Assert.Pass(); + else + Assert.Fail(); + } + public class Base{} public class Derived : Base{} } From 0ef69996399e75be015321b4452a026d1d549db0 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 16:19:05 -0700 Subject: [PATCH 3/6] removed bool implicit conversion & added | operator this gives us initialization potential with x |= 7; --- Application/iSynaptic.Commons/Maybe.cs | 7 +++++-- Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs | 12 +++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Application/iSynaptic.Commons/Maybe.cs b/Application/iSynaptic.Commons/Maybe.cs index d95edf4..66e579d 100644 --- a/Application/iSynaptic.Commons/Maybe.cs +++ b/Application/iSynaptic.Commons/Maybe.cs @@ -208,12 +208,15 @@ public static bool operator false(Maybe self) throw new NotImplementedException(); } - public static implicit operator bool(Maybe value) + public static Maybe operator |(Maybe self, Maybe other) { - return value.HasValue; + return self.HasValue ? self : other; } } + public static class MaybeOperators + {} + public static class Maybe { #region Defer Operator diff --git a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs index 507c872..b11623e 100644 --- a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs +++ b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs @@ -1284,12 +1284,18 @@ public void BoolOperators_NonNullMabesAreTrue() public void BoolOperators_NullMabesAreFalse() { var item = Maybe.NoValue; - if(!item) - Assert.Pass(); - else + if(item) Assert.Fail(); } + [Test] + public void BoolOperators_InitializationFromNoneTo7Is7() + { + Maybe item = Maybe.NoValue; + item |= 7.ToMaybe(); + Assert.That(item.Value, Is.EqualTo(7)); + } + public class Base{} public class Derived : Base{} } From 37e60b5fda76cbb1a37ca119d116765f55f94411 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 16:24:12 -0700 Subject: [PATCH 4/6] Added more tests for completion --- .../iSynaptic.Commons.UnitTests/MaybeTests.cs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs index b11623e..fac310f 100644 --- a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs +++ b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs @@ -1288,6 +1288,14 @@ public void BoolOperators_NullMabesAreFalse() Assert.Fail(); } + [Test] + public void BoolOperators_InitializationFromDefaultTo7Is7() + { + var item = default(Maybe); + item |= 7.ToMaybe(); + Assert.That(item.Value, Is.EqualTo(7)); + } + [Test] public void BoolOperators_InitializationFromNoneTo7Is7() { @@ -1296,6 +1304,14 @@ public void BoolOperators_InitializationFromNoneTo7Is7() Assert.That(item.Value, Is.EqualTo(7)); } + [Test] + public void BoolOperators_InitializationFrom7ToNoneIs7() + { + var item = 7.ToMaybe(); + item |= Maybe.NoValue; + Assert.That(item.Value, Is.EqualTo(7)); + } + public class Base{} public class Derived : Base{} } From 67cec172f947043656a6618a2d3cd0699ebd4265 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 16:41:09 -0700 Subject: [PATCH 5/6] Added more tests covering || and | operators --- Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs index fac310f..93cf5d5 100644 --- a/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs +++ b/Testing/iSynaptic.Commons.UnitTests/MaybeTests.cs @@ -1312,6 +1312,20 @@ public void BoolOperators_InitializationFrom7ToNoneIs7() Assert.That(item.Value, Is.EqualTo(7)); } + [Test] + public void BoolOperators_7OrNone_7() + { + Assert.That(7.ToMaybe() | Maybe.NoValue, Is.EqualTo(7.ToMaybe())); + Assert.That(7.ToMaybe() || Maybe.NoValue, Is.EqualTo(7.ToMaybe())); + } + + [Test] + public void BoolOperators_NoneOr7_7() + { + Assert.That(Maybe.NoValue | 7.ToMaybe(), Is.EqualTo(7.ToMaybe())); + Assert.That(Maybe.NoValue || 7.ToMaybe(), Is.EqualTo(7.ToMaybe())); + } + public class Base{} public class Derived : Base{} } From 0584b97b13fcbafd1e371d5a645de2bf09376f80 Mon Sep 17 00:00:00 2001 From: tkellogg Date: Mon, 26 Dec 2011 16:47:41 -0700 Subject: [PATCH 6/6] refined NotImplemented message I had to research a bit, but I'm pretty sure the false operator is only used for short circuiting the && operator --- Application/iSynaptic.Commons/Maybe.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Application/iSynaptic.Commons/Maybe.cs b/Application/iSynaptic.Commons/Maybe.cs index 66e579d..f5d2462 100644 --- a/Application/iSynaptic.Commons/Maybe.cs +++ b/Application/iSynaptic.Commons/Maybe.cs @@ -205,7 +205,7 @@ public static bool operator true(Maybe self) public static bool operator false(Maybe self) { - throw new NotImplementedException(); + throw new NotImplementedException("Only used for & operator, which isn't implemented"); } public static Maybe operator |(Maybe self, Maybe other)