Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CSharpEssentials.Results/Extensions/ResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ public static partial class ResultExtensions
/// <returns></returns>
public static Result ToResult(this IEnumerable<Error> errors) => errors.ToArray();

/// <summary>
/// Converts an array of errors to a result directly without copying.
/// </summary>
/// <param name="errors"></param>
/// <returns></returns>
public static Result ToResult(this Error[] errors) => Result.Failure(errors);

/// <summary>
/// Converts a value to a result.
/// </summary>
Expand All @@ -40,4 +47,12 @@ public static partial class ResultExtensions
/// <param name="errors"></param>
/// <returns></returns>
public static Result<TValue> ToResult<TValue>(this IEnumerable<Error> errors) => errors.ToArray();

/// <summary>
/// Converts an array of errors to a result directly without copying.
/// </summary>
/// <typeparam name="TValue"></typeparam>
/// <param name="errors"></param>
/// <returns></returns>
public static Result<TValue> ToResult<TValue>(this Error[] errors) => Result<TValue>.Failure(errors);
}
12 changes: 6 additions & 6 deletions CSharpEssentials.Results/Modules/Result.Bind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public readonly partial record struct Result
public Result<TOut> Bind<TOut>(Func<Result<TOut>> func)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return func();
}

Expand All @@ -25,7 +25,7 @@ public Result<TOut> Bind<TOut>(Func<Result<TOut>> func)
public Result Bind(Func<Result> func)
{
if (IsFailure)
return Errors;
return this;
return func();
}

Expand All @@ -38,7 +38,7 @@ public Result Bind(Func<Result> func)
public Task<Result<TOut>> Bind<TOut>(Func<Task<Result<TOut>>> func)
{
if (IsFailure)
return Errors.ToResult<TOut>().AsTask();
return Result<TOut>.Failure(_errors).AsTask();
return func();
}

Expand All @@ -50,7 +50,7 @@ public Task<Result<TOut>> Bind<TOut>(Func<Task<Result<TOut>>> func)
public Task<Result> Bind(Func<Task<Result>> func)
{
if (IsFailure)
return ((Result)Errors).AsTask();
return this.AsTask();
return func();
}

Expand All @@ -63,7 +63,7 @@ public Task<Result> Bind(Func<Task<Result>> func)
public ValueTask<Result<TOut>> Bind<TOut>(Func<ValueTask<Result<TOut>>> valueTask)
{
if (IsFailure)
return Failure<TOut>(Errors).AsValueTask();
return Result<TOut>.Failure(_errors).AsValueTask();
return valueTask();
}

Expand All @@ -75,7 +75,7 @@ public ValueTask<Result<TOut>> Bind<TOut>(Func<ValueTask<Result<TOut>>> valueTas
public ValueTask<Result> Bind(Func<ValueTask<Result>> valueTask)
{
if (IsFailure)
return Failure(Errors).AsValueTask();
return this.AsValueTask();
return valueTask();
}
}
Expand Down
6 changes: 3 additions & 3 deletions CSharpEssentials.Results/Modules/Result.Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public readonly partial record struct Result
public Result<TOut> Map<TOut>(Func<TOut> map)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return map();
}

Expand All @@ -25,7 +25,7 @@ public Result<TOut> Map<TOut>(Func<TOut> map)
public Result<TOut> Map<TOut>(Func<Result<TOut>> map)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return map();
}
}
Expand Down Expand Up @@ -58,7 +58,7 @@ public static async Task<Result<TOut>> MapAsync<TOut>(this Task<Result> task, Fu
{
Result result = await task.WithCancellation(cancellationToken);
if (result.IsFailure)
return result.Errors;
return Result<TOut>.Failure(result.ErrorsOrEmptyArray);
return await map().WithCancellation(cancellationToken);
}

Expand Down
4 changes: 2 additions & 2 deletions CSharpEssentials.Results/Modules/Result.MapError.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ public Result MapError(Func<Error[], Error[]> errorMapper)
{
if (IsSuccess)
return this;
return errorMapper(Errors);
return Result.Failure(errorMapper(Errors));
}

public Result MapError(Func<Error, Error> errorMapper)
{
if (IsSuccess)
return this;
return errorMapper(FirstError);
return Result.Failure(errorMapper(FirstError));
}
}
12 changes: 6 additions & 6 deletions CSharpEssentials.Results/Modules/ResultT.Bind.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public readonly partial record struct Result<TValue>
public Result<TOut> Bind<TOut>(Func<TValue, Result<TOut>> func)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return func(Value);
}

Expand All @@ -25,7 +25,7 @@ public Result<TOut> Bind<TOut>(Func<TValue, Result<TOut>> func)
public Result Bind(Func<TValue, Result> func)
{
if (IsFailure)
return Errors;
return Result.Failure(_errors);
return func(Value);
}

Expand All @@ -38,7 +38,7 @@ public Result Bind(Func<TValue, Result> func)
public Task<Result<TOut>> Bind<TOut>(Func<TValue, Task<Result<TOut>>> func)
{
if (IsFailure)
return Errors.ToResult<TOut>().AsTask();
return Result<TOut>.Failure(_errors).AsTask();
return func(Value);
}

Expand All @@ -50,7 +50,7 @@ public Task<Result<TOut>> Bind<TOut>(Func<TValue, Task<Result<TOut>>> func)
public Task<Result> Bind(Func<TValue, Task<Result>> func)
{
if (IsFailure)
return ((Result)Errors).AsTask();
return Result.Failure(_errors).AsTask();
return func(Value);
}

Expand All @@ -63,7 +63,7 @@ public Task<Result> Bind(Func<TValue, Task<Result>> func)
public ValueTask<Result<TOut>> Bind<TOut>(Func<TValue, ValueTask<Result<TOut>>> valueTask)
{
if (IsFailure)
return Errors.ToResult<TOut>().AsValueTask();
return Result<TOut>.Failure(_errors).AsValueTask();
return valueTask(Value);
}

Expand All @@ -76,7 +76,7 @@ public ValueTask<Result<TOut>> Bind<TOut>(Func<TValue, ValueTask<Result<TOut>>>
public ValueTask<Result> Bind(Func<TValue, ValueTask<Result>> valueTask)
{
if (IsFailure)
return ((Result)Errors).AsValueTask();
return Result.Failure(_errors).AsValueTask();
return valueTask(Value);
}
}
Expand Down
12 changes: 6 additions & 6 deletions CSharpEssentials.Results/Modules/ResultT.Else.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public Result<TValue> Else(Func<Error[], Error> onFailure)
{
if (IsSuccess)
return Value;
return onFailure(Errors).ToResult<TValue>();
return Result<TValue>.Failure(onFailure(Errors));
}

/// <summary>
Expand All @@ -26,7 +26,7 @@ public Result<TValue> Else(Func<Error[], Error[]> onFailure)
{
if (IsSuccess)
return Value;
return onFailure(Errors).ToResult<TValue>();
return Result<TValue>.Failure(onFailure(Errors));
}

/// <summary>
Expand All @@ -38,7 +38,7 @@ public Result<TValue> Else(Error error)
{
if (IsSuccess)
return Value;
return error.ToResult<TValue>();
return Result<TValue>.Failure(error);
}

/// <summary>
Expand Down Expand Up @@ -90,7 +90,7 @@ public async Task<Result<TValue>> ElseAsync(Func<Error[], Task<Error>> onFailure
if (IsSuccess)
return Value;
Error result = await onFailure(Errors).WithCancellation(cancellationToken);
return result.ToResult<TValue>();
return Result<TValue>.Failure(result);
}

/// <summary>
Expand All @@ -104,7 +104,7 @@ public async Task<Result<TValue>> ElseAsync(Func<Error[], Task<Error[]>> onFailu
if (IsSuccess)
return Value;
Error[] result = await onFailure(Errors).WithCancellation(cancellationToken);
return result.ToResult<TValue>();
return Result<TValue>.Failure(result);
}

/// <summary>
Expand All @@ -118,7 +118,7 @@ public async Task<Result<TValue>> ElseAsync(Task<Error> error, CancellationToken
if (IsSuccess)
return Value;
Error result = await error.WithCancellation(cancellationToken);
return result.ToResult<TValue>();
return Result<TValue>.Failure(result);
}

/// <summary>
Expand Down
12 changes: 6 additions & 6 deletions CSharpEssentials.Results/Modules/ResultT.Ensure.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,42 +9,42 @@ public Result<TValue> Ensure(Func<TValue, bool> predicate, Error error)
{
if (IsFailure)
return this;
return predicate(Value) ? this : error.ToResult<TValue>();
return predicate(Value) ? this : Result<TValue>.Failure(error);
}

public Result<TValue> Ensure(Func<TValue, bool> predicate, Func<TValue, Error> errorFactory)
{
if (IsFailure)
return this;
return predicate(Value) ? this : errorFactory(Value).ToResult<TValue>();
return predicate(Value) ? this : Result<TValue>.Failure(errorFactory(Value));
}

public Result<TValue> EnsureNotNull(Error error)
{
if (IsFailure)
return this;
return Value is not null ? this : error.ToResult<TValue>();
return Value is not null ? this : Result<TValue>.Failure(error);
}

public Result<TValue> EnsureNotNull(Func<TValue, Error> errorFactory)
{
if (IsFailure)
return this;
return Value is not null ? this : errorFactory(Value).ToResult<TValue>();
return Value is not null ? this : Result<TValue>.Failure(errorFactory(Value));
}

public async Task<Result<TValue>> EnsureAsync(Func<TValue, Task<bool>> predicate, Error error, CancellationToken cancellationToken = default)
{
if (IsFailure)
return this;
return await predicate(Value).WithCancellation(cancellationToken) ? this : error.ToResult<TValue>();
return await predicate(Value).WithCancellation(cancellationToken) ? this : Result<TValue>.Failure(error);
}

public async Task<Result<TValue>> EnsureAsync(Func<TValue, Task<bool>> predicate, Func<TValue, Error> errorFactory, CancellationToken cancellationToken = default)
{
if (IsFailure)
return this;
return await predicate(Value).WithCancellation(cancellationToken) ? this : errorFactory(Value).ToResult<TValue>();
return await predicate(Value).WithCancellation(cancellationToken) ? this : Result<TValue>.Failure(errorFactory(Value));
}
}

Expand Down
6 changes: 3 additions & 3 deletions CSharpEssentials.Results/Modules/ResultT.Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public readonly partial record struct Result<TValue>
public Result<TOut> Map<TOut>(Func<TValue, TOut> map)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return map(Value);
}

Expand All @@ -25,7 +25,7 @@ public Result<TOut> Map<TOut>(Func<TValue, TOut> map)
public Result<TOut> Map<TOut>(Func<TValue, Result<TOut>> map)
{
if (IsFailure)
return Errors;
return Result<TOut>.Failure(_errors);
return map(Value);
}
}
Expand Down Expand Up @@ -60,7 +60,7 @@ public static async Task<Result<TOut>> MapAsync<TValue, TOut>(this Task<Result<T
{
Result<TValue> result = await task.WithCancellation(cancellationToken);
if (result.IsFailure)
return result.Errors;
return Result<TOut>.Failure(result.ErrorsOrEmptyArray);
return await map(result.Value).WithCancellation(cancellationToken);
}

Expand Down
4 changes: 2 additions & 2 deletions CSharpEssentials.Results/Modules/ResultT.MapError.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ public Result<TValue> MapError(Func<Error[], Error[]> errorMapper)
{
if (IsSuccess)
return this;
return errorMapper(Errors).ToResult<TValue>();
return Result<TValue>.Failure(errorMapper(Errors));
}

public Result<TValue> MapError(Func<Error, Error> errorMapper)
{
if (IsSuccess)
return this;
return errorMapper(FirstError).ToResult<TValue>();
return Result<TValue>.Failure(errorMapper(FirstError));
}
}
2 changes: 1 addition & 1 deletion CSharpEssentials.Results/Modules/ResultT.Select.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ public static async Task<Result<TOut>> SelectAsync<TValue, TOut>(this Task<Resul
{
Result<TValue> result = await task.WithCancellation(cancellationToken);
if (result.IsFailure)
return result.Errors;
return Result<TOut>.Failure(result.ErrorsOrEmptyArray);
return await selector(result.Value).WithCancellation(cancellationToken);
}

Expand Down
12 changes: 6 additions & 6 deletions CSharpEssentials.Results/Modules/ResultT.Then.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public readonly partial record struct Result<TValue>
public Result<T> Then<T>(Func<TValue, Result<T>> onSuccess)
{
if (IsFailure)
return Errors.ToResult<T>();
return Result<T>.Failure(_errors);
return onSuccess(Value);
}

Expand All @@ -25,7 +25,7 @@ public Result<T> Then<T>(Func<TValue, Result<T>> onSuccess)
public Result<TValue> ThenDo(Action<TValue> action)
{
if (IsFailure)
return Errors;
return this;
action(Value);
return this;
}
Expand All @@ -39,7 +39,7 @@ public Result<TValue> ThenDo(Action<TValue> action)
public Result<T> Then<T>(Func<TValue, T> onSuccess)
{
if (IsFailure)
return Errors.ToResult<T>();
return Result<T>.Failure(_errors);
return onSuccess(Value).ToResult<T>();
}

Expand All @@ -53,7 +53,7 @@ public Result<T> Then<T>(Func<TValue, T> onSuccess)
public async Task<Result<T>> ThenAsync<T>(Func<TValue, Task<Result<T>>> onSuccess, CancellationToken cancellationToken = default)
{
if (IsFailure)
return Errors.ToResult<T>();
return Result<T>.Failure(_errors);
return await onSuccess(Value).WithCancellation(cancellationToken);
}

Expand All @@ -66,7 +66,7 @@ public async Task<Result<T>> ThenAsync<T>(Func<TValue, Task<Result<T>>> onSucces
public async Task<Result<TValue>> ThenDoAsync(Func<TValue, Task> action, CancellationToken cancellationToken = default)
{
if (IsFailure)
return Errors;
return this;
await action(Value).WithCancellation(cancellationToken);
return this;
}
Expand All @@ -81,7 +81,7 @@ public async Task<Result<TValue>> ThenDoAsync(Func<TValue, Task> action, Cancell
public async Task<Result<T>> ThenAsync<T>(Func<TValue, Task<T>> onSuccess, CancellationToken cancellationToken = default)
{
if (IsFailure)
return Errors.ToResult<T>();
return Result<T>.Failure(_errors);
T? result = await onSuccess(Value).WithCancellation(cancellationToken);
return result.ToResult();
}
Expand Down
Loading
Loading