From 1df38902f21188ce1d9181c964a455460e7b756b Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 30 May 2026 16:02:20 +0000
Subject: [PATCH 1/2] Initial plan
From 90f8ee0284a0ec317e150634407b56ba08247adb Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 30 May 2026 16:07:17 +0000
Subject: [PATCH 2/2] feat: add public optional value interface
---
src/OptionalValues/IOptionalValue.cs | 12 ++++++++++++
.../Internal/IOptionalValueInternals.cs | 6 ++----
src/OptionalValues/PublicAPI.Unshipped.txt | 3 +++
.../OptionalValues.Tests/OptionalValueTest.cs | 19 +++++++++++++++++++
4 files changed, 36 insertions(+), 4 deletions(-)
create mode 100644 src/OptionalValues/IOptionalValue.cs
diff --git a/src/OptionalValues/IOptionalValue.cs b/src/OptionalValues/IOptionalValue.cs
new file mode 100644
index 0000000..5f9ff77
--- /dev/null
+++ b/src/OptionalValues/IOptionalValue.cs
@@ -0,0 +1,12 @@
+namespace OptionalValues;
+
+///
+/// Represents an optional value that may or may not be specified.
+///
+public interface IOptionalValue
+{
+ ///
+ /// Whether the value is specified.
+ ///
+ bool IsSpecified { get; }
+}
diff --git a/src/OptionalValues/Internal/IOptionalValueInternals.cs b/src/OptionalValues/Internal/IOptionalValueInternals.cs
index d8eec72..d0676ee 100644
--- a/src/OptionalValues/Internal/IOptionalValueInternals.cs
+++ b/src/OptionalValues/Internal/IOptionalValueInternals.cs
@@ -1,9 +1,7 @@
-namespace OptionalValues.Internal;
+namespace OptionalValues.Internal;
-internal interface IOptionalValueInternals
+internal interface IOptionalValueInternals : IOptionalValue
{
- bool IsSpecified { get; }
-
object? GetValue();
object? GetSpecifiedValue();
diff --git a/src/OptionalValues/PublicAPI.Unshipped.txt b/src/OptionalValues/PublicAPI.Unshipped.txt
index e69de29..4ae5f0c 100644
--- a/src/OptionalValues/PublicAPI.Unshipped.txt
+++ b/src/OptionalValues/PublicAPI.Unshipped.txt
@@ -0,0 +1,3 @@
+#nullable enable
+OptionalValues.IOptionalValue
+OptionalValues.IOptionalValue.IsSpecified.get -> bool
\ No newline at end of file
diff --git a/test/OptionalValues.Tests/OptionalValueTest.cs b/test/OptionalValues.Tests/OptionalValueTest.cs
index 0bed92b..3714be2 100644
--- a/test/OptionalValues.Tests/OptionalValueTest.cs
+++ b/test/OptionalValues.Tests/OptionalValueTest.cs
@@ -55,6 +55,25 @@ public void Should_Be_True_For(string? value)
}
}
+ public class PublicInterface : OptionalValueTest
+ {
+ [Fact]
+ public void Should_Be_Implemented_By_OptionalValue()
+ {
+ IOptionalValue sut = new OptionalValue("Value");
+
+ sut.IsSpecified.ShouldBeTrue();
+ }
+
+ [Fact]
+ public void Should_Expose_Unspecified_State()
+ {
+ IOptionalValue sut = OptionalValue.Unspecified;
+
+ sut.IsSpecified.ShouldBeFalse();
+ }
+ }
+
public class Value : OptionalValueTest
{
[Fact]