Skip to content

Commit b0b37fe

Browse files
authored
Merge pull request #576 from marcinjahn/toresult-with-error-func
feat: add lazy overload of Maybe.ToResult
2 parents 0d8259f + 6896bd3 commit b0b37fe

File tree

8 files changed

+101
-120
lines changed

8 files changed

+101
-120
lines changed

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.Task.Left.cs

Lines changed: 0 additions & 53 deletions
This file was deleted.

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.Task.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public async Task ToResult_Task_returns_success_if_has_value()
2222
{
2323
var maybe = Maybe<T>.From(T.Value);
2424

25-
var result = await maybe.AsTask().ToResult("Error".AsTask());
25+
var result = await maybe.AsTask().ToResult("Error");
2626

2727
result.IsSuccess.Should().BeTrue();
2828
result.Value.Should().Be(T.Value);
@@ -44,10 +44,32 @@ public async Task ToResult_Task_custom_failure_returns_success_if_has_value()
4444
{
4545
var maybe = Maybe<T>.From(T.Value);
4646

47-
var result = await maybe.AsTask().ToResult(E.Value.AsTask());
47+
var result = await maybe.AsTask().ToResult(E.Value);
48+
49+
result.IsSuccess.Should().BeTrue();
50+
result.Value.Should().Be(T.Value);
51+
}
52+
53+
[Fact]
54+
public async Task ToResult_Task_returns_custom_failure_via_error_function_if_has_no_value()
55+
{
56+
Maybe<T> maybe = null;
57+
58+
var result = await maybe.AsTask().ToResult(() => E.Value);
59+
60+
result.IsSuccess.Should().BeFalse();
61+
result.Error.Should().Be(E.Value);
62+
}
63+
64+
[Fact]
65+
public async Task ToResult_Task_custom_failure_with_error_function_returns_success_if_has_value()
66+
{
67+
var maybe = Maybe<T>.From(T.Value);
68+
69+
var result = await maybe.AsTask().ToResult(() => E.Value);
4870

4971
result.IsSuccess.Should().BeTrue();
5072
result.Value.Should().Be(T.Value);
5173
}
5274
}
53-
}
75+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.ValueTask.Left.cs

Lines changed: 0 additions & 54 deletions
This file was deleted.

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.ValueTask.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public async Task ToResult_ValueTask_returns_success_if_has_value()
2323
{
2424
var maybe = Maybe<T>.From(T.Value);
2525

26-
var result = await maybe.AsValueTask().ToResult("Error".AsValueTask());
26+
var result = await maybe.AsValueTask().ToResult("Error");
2727

2828
result.IsSuccess.Should().BeTrue();
2929
result.Value.Should().Be(T.Value);
@@ -45,10 +45,32 @@ public async Task ToResult_ValueTask_custom_failure_returns_success_if_has_value
4545
{
4646
var maybe = Maybe<T>.From(T.Value);
4747

48-
var result = await maybe.AsValueTask().ToResult(E.Value.AsValueTask());
48+
var result = await maybe.AsValueTask().ToResult(E.Value);
49+
50+
result.IsSuccess.Should().BeTrue();
51+
result.Value.Should().Be(T.Value);
52+
}
53+
54+
[Fact]
55+
public async Task ToResult_ValueTask_returns_custom_failure_via_error_function_if_has_no_value()
56+
{
57+
Maybe<T> maybe = null;
58+
59+
var result = await maybe.AsValueTask().ToResult(() => E.Value);
60+
61+
result.IsSuccess.Should().BeFalse();
62+
result.Error.Should().Be(E.Value);
63+
}
64+
65+
[Fact]
66+
public async Task ToResult_ValueTask_custom_failure_with_error_function_returns_success_if_has_value()
67+
{
68+
var maybe = Maybe<T>.From(T.Value);
69+
70+
var result = await maybe.AsValueTask().ToResult(() => E.Value);
4971

5072
result.IsSuccess.Should().BeTrue();
5173
result.Value.Should().Be(T.Value);
5274
}
5375
}
54-
}
76+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/ToResultTests.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using FluentAssertions;
1+
using FluentAssertions;
32
using Xunit;
43

54
namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
@@ -49,5 +48,27 @@ public void ToResult_custom_failure_returns_success_if_has_value()
4948
result.IsSuccess.Should().BeTrue();
5049
result.Value.Should().Be(T.Value);
5150
}
51+
52+
[Fact]
53+
public void ToResult_returns_custom_failure_via_error_function_if_has_no_value()
54+
{
55+
Maybe<T> maybe = null;
56+
57+
var result = maybe.ToResult(() => E.Value);
58+
59+
result.IsSuccess.Should().BeFalse();
60+
result.Error.Should().Be(E.Value);
61+
}
62+
63+
[Fact]
64+
public void ToResult_custom_failure_with_error_function_returns_success_if_has_value()
65+
{
66+
var maybe = Maybe<T>.From(T.Value);
67+
68+
var result = maybe.ToResult(() => E.Value);
69+
70+
result.IsSuccess.Should().BeTrue();
71+
result.Value.Should().Be(T.Value);
72+
}
5273
}
5374
}

CSharpFunctionalExtensions/Maybe/Extensions/ToResult.Task.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Threading.Tasks;
1+
using System;
2+
using System.Threading.Tasks;
23

34
namespace CSharpFunctionalExtensions
45
{
@@ -15,5 +16,11 @@ public static async Task<Result<T, E>> ToResult<T, E>(this Task<Maybe<T>> maybeT
1516
var maybe = await maybeTask.DefaultAwait();
1617
return maybe.ToResult(error);
1718
}
19+
20+
public static async Task<Result<T, E>> ToResult<T, E>(this Task<Maybe<T>> maybeTask, Func<E> errorFunc)
21+
{
22+
var maybe = await maybeTask.DefaultAwait();
23+
return maybe.ToResult(errorFunc);
24+
}
1825
}
19-
}
26+
}

CSharpFunctionalExtensions/Maybe/Extensions/ToResult.ValueTask.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ public static async ValueTask<Result<T, E>> ToResult<T, E>(this ValueTask<Maybe<
1717
Maybe<T> maybe = await maybeTask;
1818
return maybe.ToResult(error);
1919
}
20+
21+
public static async ValueTask<Result<T, E>> ToResult<T, E>(this ValueTask<Maybe<T>> maybeTask, Func<E> errorFunc)
22+
{
23+
Maybe<T> maybe = await maybeTask;
24+
return maybe.ToResult(errorFunc);
25+
}
2026
}
2127
}
22-
#endif
28+
#endif

CSharpFunctionalExtensions/Maybe/Extensions/ToResult.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
namespace CSharpFunctionalExtensions
1+
using System;
2+
3+
namespace CSharpFunctionalExtensions
24
{
35
public static partial class MaybeExtensions
46
{
@@ -17,5 +19,13 @@ public static Result<T, E> ToResult<T, E>(in this Maybe<T> maybe, E error)
1719

1820
return Result.Success<T, E>(maybe.GetValueOrThrow());
1921
}
22+
23+
public static Result<T, E> ToResult<T, E>(in this Maybe<T> maybe, Func<E> errorFunc)
24+
{
25+
if (maybe.HasNoValue)
26+
return Result.Failure<T, E>(errorFunc());
27+
28+
return Result.Success<T, E>(maybe.GetValueOrThrow());
29+
}
2030
}
21-
}
31+
}

0 commit comments

Comments
 (0)