Skip to content

Commit 5817259

Browse files
authored
feature(Result): add mechanism to replace a previous success with Unit
1 parent 47afb92 commit 5817259

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

Directory.Packages.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<ItemGroup>
66
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.4.0.108396" PrivateAssets="all" />
77
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="all" />
8-
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
9-
<PackageVersion Include="xunit" Version="2.9.2" />
8+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.12.0" PrivateAssets="all" />
9+
<PackageVersion Include="xunit" Version="2.9.2" PrivateAssets="all" />
1010
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.0" PrivateAssets="all" />
1111
<PackageVersion Include="coverlet.msbuild" Version="6.0.2" PrivateAssets="all" />
1212
</ItemGroup>

libraries/core/documentation/monads/result.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ Type intended to handle both the possible failure and the expected success of a
4040
- [`Map<TSuccessToMap>(createSuccessToMap)`](#maptsuccesstomapcreatesuccesstomap)
4141
- [`Bind<TSuccessToBind>(createResultToBind)`](#bindtsuccesstobindcreateresulttobind)
4242
- [`Reset<TSuccessToInitialize>(initializerResult)`](#resettsuccesstoinitializeinitializerresult)
43+
- [`Discard()`](#discard)
4344
- [`Reduce<TReducer>(reduceFailure, reduceSuccess)`](#reducetreducerreducefailure-reducesuccess)
4445
- [`Equals(obj)`](#equalsobj)
4546
- [`Equals(other)`](#equalsother)
@@ -495,6 +496,18 @@ which may have the same or different type of expected success.
495496

496497
***[Top](#resulttfailure-tsuccess)***
497498

499+
#### `Discard()`
500+
501+
- Signature:
502+
503+
```cs
504+
public Result<TFailure, Unit> Discard()
505+
```
506+
507+
- Description: Replaces the previous success with [`Unit`](../unit.md).
508+
509+
***[Top](#resulttfailure-tsuccess)***
510+
498511
#### `Reduce<TReducer>(reduceFailure, reduceSuccess)`
499512

500513
- Signature:

libraries/core/source/Monads/Result.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ public Result<TFailure, TSuccessInitializer> Reset<TSuccessInitializer>(
243243
? new(Failure)
244244
: initializerResult;
245245

246+
/// <summary>Replaces the previous success with <see cref="Unit"/>.</summary>
247+
/// <returns>A new failed result if <see cref="IsFailed"/> is <see langword="true" />; otherwise, a new success result containing <see cref="Unit"/>.</returns>
248+
public Result<TFailure, Unit> Discard()
249+
=> IsFailed
250+
? new(Failure)
251+
: new(Unit.Discarder);
252+
246253
/// <summary>Creates a new reduced failure if the previous result is failed; otherwise, creates a new reduced success.</summary>
247254
/// <param name="reduceFailure">Creates a possible reduced failure.</param>
248255
/// <param name="reduceSuccess">Creates an expected reduced success.</param>

libraries/core/tests/unit/Monads/ResultTests.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ public sealed class ResultTests
2424

2525
private const string memberBind = nameof(Result<object, object>.Bind);
2626

27+
private const string memberDiscard = nameof(Result<object, object>.Discard);
28+
2729
private const string memberReduce = nameof(Result<object, object>.Reduce);
2830

2931
private const string memberEquals = nameof(Result<object, object>.Equals);
@@ -676,6 +678,30 @@ public void Bind_SuccessfulResultPlusCreateResultToBindWithSuccessfulResult_Succ
676678

677679
#endregion
678680

681+
#region Discard
682+
683+
[Fact]
684+
[Trait(@base, memberDiscard)]
685+
public void Discard_FailedResult_FailedResult()
686+
{
687+
const string expected = ResultFixture.Failure;
688+
Result<string, Unit> actual = ResultMother.Fail(expected)
689+
.Discard();
690+
ResultAsserter.CheckIfAreFailed(expected, actual);
691+
}
692+
693+
[Fact]
694+
[Trait(@base, memberDiscard)]
695+
public void Discard_SuccessfulResult_Unit()
696+
{
697+
Unit expected = Unit.Discarder;
698+
Result<string, Unit> actual = ResultMother.Succeed(ResultFixture.Success)
699+
.Discard();
700+
ResultAsserter.CheckIfAreSuccessful(expected, actual);
701+
}
702+
703+
#endregion
704+
679705
#region Reduce
680706

681707
[Fact]

0 commit comments

Comments
 (0)