Skip to content

Commit

Permalink
change result iternface
Browse files Browse the repository at this point in the history
  • Loading branch information
lucasteles committed May 24, 2023
1 parent 54c7723 commit 8141858
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 21 deletions.
18 changes: 6 additions & 12 deletions src/Result/Result.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ namespace CSharpPlus.Result;
/// </summary>
[DebuggerDisplay("{DebuggerDisplay(),nq}")]
[System.Text.Json.Serialization.JsonConverter(typeof(ResultJsonConverterFactory))]
public readonly struct Result<TOk, TError> : IEnumerable<TOk>, IEquatable<Result<TOk, TError>>

public readonly struct Result<TOk, TError> : IEquatable<Result<TOk, TError>>
{
internal TOk? OkValue { get; }
internal TError? ErrorValue { get; }
Expand Down Expand Up @@ -125,20 +124,15 @@ public Result(TError error)
/// <inheritdoc />
public override string? ToString() => IsOk ? OkValue.ToString() : ErrorValue.ToString();

/// <inheritdoc />
IEnumerator<TOk> IEnumerable<TOk>.GetEnumerator()
{
if (IsOk)
yield return OkValue;
}

/// <summary>
/// Convert the result to an enumerable of length 0 or 1.
/// </summary>
/// <returns></returns>
public IEnumerable<TOk> AsEnumerable() => this;

IEnumerator IEnumerable.GetEnumerator() => this.AsEnumerable().GetEnumerator();
public IEnumerable<TOk> AsEnumerable()
{
if (IsOk)
yield return OkValue;
}

/// <summary>
/// Convert the result to an array of length 0 or 1.
Expand Down
21 changes: 21 additions & 0 deletions src/Result/ResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,27 @@ public static class Result
error(result.ErrorValue);
}


/// <summary>
/// Run side effect when result is OK
/// </summary>
public static Result<TOk, TError> Tap<TOk, TError>(
this Result<TOk, TError> result, Action<TOk> action)
{
if (result.IsOk) action(result.OkValue);
return result;
}

/// <summary>
/// Run side effect when result is OK
/// </summary>
public static async Task<Result<TOk, TError>> Tap<TOk, TError>(
this Result<TOk, TError> result, Func<TOk, Task> action)
{
if (result.IsOk) await action(result.OkValue);
return result;
}

/// <summary>
/// Switch the result to process value
/// </summary>
Expand Down
18 changes: 9 additions & 9 deletions tests/CSharpPlus.Tests/ResultTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public void ShouldSerializeOkResult()
var ok = Result<int, string>.Ok(42);
var strJson = JsonSerializer.Serialize(ok);
var okFromJson = JsonSerializer.Deserialize<Result<int, string>>(strJson);
okFromJson.Should().Equal(ok);
okFromJson.Should().Be(ok);
}

[Test]
Expand All @@ -37,7 +37,7 @@ public void ShouldSerializeErrorResult()
var error = Result<int, string>.Error("foo");
var strJson = JsonSerializer.Serialize(error);
var errorFromJson = JsonSerializer.Deserialize<Result<int, string>>(strJson);
errorFromJson.Should().Equal(error);
errorFromJson.Should().Be(error);
}

[Test]
Expand All @@ -48,7 +48,7 @@ public void ShouldCombineOkResults()
from ok2 in Result<int, string>.Ok(100)
select ok1 + ok2;

result.Should().Equal(Result.Ok(142));
result.Should().Be(Result.Ok(142));
}

[Test]
Expand All @@ -59,13 +59,13 @@ public void ShouldShorCircuitErrorResult()
from ok2 in Result<int, string>.Error("FAIL")
from ok3 in Result<int, string>.Ok(100)
select ok1 + ok2 + ok3;
result.Should().Equal(Result.Error<int, string>("FAIL"));
result.Should().Be(Result.Error<int, string>("FAIL"));
}

[Test]
public void ShouldBeEnumerable()
{
foreach (var value in Result<int, string>.Ok(42))
foreach (var value in Result<int, string>.Ok(42).AsEnumerable())
if (value == 42)
Assert.Pass();

Expand All @@ -75,7 +75,7 @@ public void ShouldBeEnumerable()
[Test]
public void ShouldMatchPropertyOk()
{
if (Result<int, string>.Ok(42) is { Value: 42 })
if (Result<int, string>.Ok(42) is {Value: 42})
Assert.Pass();

Assert.Fail("unexpected!");
Expand All @@ -94,7 +94,7 @@ public void ShouldMatchTupleOk()
public void ShouldMapValue() =>
Result<int, string>.Ok(42)
.Select(x => x.ToString())
.Should().Equal(Result<string, string>.Ok("42"));
.Should().Be(Result<string, string>.Ok("42"));

[Test]
public void ShouldTryGet()
Expand All @@ -111,7 +111,7 @@ public void ShouldTryGet()
public async Task ShouldMapAsync()
{
var result = await Result<int, string>.Ok(42).SelectAsync(Task.FromResult);
result.Should().Equal(Result.Ok(42));
result.Should().Be(Result.Ok(42));
}

[Test]
Expand All @@ -120,6 +120,6 @@ public async Task ShouldBindAsync()
var result = await Result<int, string>.Ok(42)
.SelectManyAsync(x => Task.FromResult(Result.Ok(x + 10)));

result.Should().Equal(Result.Ok(52));
result.Should().Be(Result.Ok(52));
}
}

0 comments on commit 8141858

Please sign in to comment.