Skip to content

Commit

Permalink
Merge pull request #12 from pfpack/feature/async-pipeline-options
Browse files Browse the repository at this point in the history
Feature/async pipeline options
  • Loading branch information
andreise authored Aug 26, 2023
2 parents 043a0ee + 824359b commit 0ac62ed
Show file tree
Hide file tree
Showing 44 changed files with 1,198 additions and 612 deletions.
Original file line number Diff line number Diff line change
@@ -1,42 +1,41 @@
using System.Threading;
using System.Threading.Tasks;

namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TSuccess, TFailure> Filter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerFilter(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));
public AsyncPipeline<TSuccess, TFailure> Filter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerFilter(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));

public AsyncPipeline<TSuccess, TFailure> Filter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, CancellationToken, Task<TFailure>> causeFactoryAsync)
=>
InnerFilter(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactoryAsync ?? throw new ArgumentNullException(nameof(causeFactoryAsync)));
public AsyncPipeline<TSuccess, TFailure> Filter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, CancellationToken, Task<TFailure>> causeFactoryAsync)
=>
InnerFilter(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactoryAsync ?? throw new ArgumentNullException(nameof(causeFactoryAsync)));

private AsyncPipeline<TSuccess, TFailure> InnerFilter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerPipe(
(r, t) => r.FilterAsync(
s => predicateAsync.Invoke(s, t),
f => f.InternalPipe(causeFactory).InternalPipe(Task.FromResult)));
private AsyncPipeline<TSuccess, TFailure> InnerFilter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerPipe(
(r, t) => r.FilterAsync(
s => predicateAsync.Invoke(s, t),
f => f.InternalPipe(causeFactory).InternalPipe(Task.FromResult)));

private AsyncPipeline<TSuccess, TFailure> InnerFilter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, CancellationToken, Task<TFailure>> causeFactoryAsync)
=>
InnerPipe(
(r, t) => r.FilterAsync(
s => predicateAsync.Invoke(s, t),
f => causeFactoryAsync.Invoke(f, t)));
}
private AsyncPipeline<TSuccess, TFailure> InnerFilter(
Func<TSuccess, CancellationToken, Task<bool>> predicateAsync,
Func<TSuccess, CancellationToken, Task<TFailure>> causeFactoryAsync)
=>
InnerPipe(
(r, t) => r.FilterAsync(
s => predicateAsync.Invoke(s, t),
f => causeFactoryAsync.Invoke(f, t)));
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TSuccess, TFailure> Filter(Func<TSuccess, bool> predicate, Func<TSuccess, TFailure> causeFactory)
=>
InnerFilter(
predicate ?? throw new ArgumentNullException(nameof(predicate)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));
public AsyncPipeline<TSuccess, TFailure> Filter(Func<TSuccess, bool> predicate, Func<TSuccess, TFailure> causeFactory)
=>
InnerFilter(
predicate ?? throw new ArgumentNullException(nameof(predicate)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));

private AsyncPipeline<TSuccess, TFailure> InnerFilter(Func<TSuccess, bool> predicate, Func<TSuccess, TFailure> causeFactory)
=>
InnerPipe(
r => r.Filter(predicate, causeFactory));
}
private AsyncPipeline<TSuccess, TFailure> InnerFilter(Func<TSuccess, bool> predicate, Func<TSuccess, TFailure> causeFactory)
=>
InnerPipe(
r => r.Filter(predicate, causeFactory));
}
Original file line number Diff line number Diff line change
@@ -1,42 +1,41 @@
using System.Threading;
using System.Threading.Tasks;

namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TSuccess, TFailure> FilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerFilterValue(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));
public AsyncPipeline<TSuccess, TFailure> FilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerFilterValue(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactory ?? throw new ArgumentNullException(nameof(causeFactory)));

public AsyncPipeline<TSuccess, TFailure> FilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, CancellationToken, ValueTask<TFailure>> causeFactoryAsync)
=>
InnerFilterValue(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactoryAsync ?? throw new ArgumentNullException(nameof(causeFactoryAsync)));
public AsyncPipeline<TSuccess, TFailure> FilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, CancellationToken, ValueTask<TFailure>> causeFactoryAsync)
=>
InnerFilterValue(
predicateAsync ?? throw new ArgumentNullException(nameof(predicateAsync)),
causeFactoryAsync ?? throw new ArgumentNullException(nameof(causeFactoryAsync)));

private AsyncPipeline<TSuccess, TFailure> InnerFilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerPipeValue(
(r, t) => r.FilterValueAsync(
s => predicateAsync.Invoke(s, t),
f => f.InternalPipe(causeFactory).InternalPipe(ValueTask.FromResult)));
private AsyncPipeline<TSuccess, TFailure> InnerFilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, TFailure> causeFactory)
=>
InnerPipeValue(
(r, t) => r.FilterValueAsync(
s => predicateAsync.Invoke(s, t),
f => f.InternalPipe(causeFactory).InternalPipe(ValueTask.FromResult)));

private AsyncPipeline<TSuccess, TFailure> InnerFilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, CancellationToken, ValueTask<TFailure>> causeFactoryAsync)
=>
InnerPipeValue(
(r, t) => r.FilterValueAsync(
s => predicateAsync.Invoke(s, t),
f => causeFactoryAsync.Invoke(f, t)));
}
private AsyncPipeline<TSuccess, TFailure> InnerFilterValue(
Func<TSuccess, CancellationToken, ValueTask<bool>> predicateAsync,
Func<TSuccess, CancellationToken, ValueTask<TFailure>> causeFactoryAsync)
=>
InnerPipeValue(
(r, t) => r.FilterValueAsync(
s => predicateAsync.Invoke(s, t),
f => causeFactoryAsync.Invoke(f, t)));
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
using System.Threading;
using System.Threading.Tasks;

namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TResultSuccess, TResultFailure> Fold<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
InnerFold(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));
public AsyncPipeline<TResultSuccess, TResultFailure> Fold<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
InnerFold(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));

private AsyncPipeline<TResultSuccess, TResultFailure> InnerFold<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
new(
pipeline.InternalPipe(
(r, t) => r.FoldAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t))));
}
private AsyncPipeline<TResultSuccess, TResultFailure> InnerFold<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
new(
pipeline.InternalPipe(
(r, t) => r.FoldAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t))));
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,22 @@
namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TResultSuccess, TResultFailure> Fold<TResultSuccess, TResultFailure>(
Func<TSuccess, Result<TResultSuccess, TResultFailure>> mapSuccess,
Func<TFailure, Result<TResultSuccess, TResultFailure>> mapFailure)
where TResultFailure : struct
=>
InnerFold(
mapSuccess ?? throw new ArgumentNullException(nameof(mapSuccess)),
mapFailure ?? throw new ArgumentNullException(nameof(mapFailure)));
public AsyncPipeline<TResultSuccess, TResultFailure> Fold<TResultSuccess, TResultFailure>(
Func<TSuccess, Result<TResultSuccess, TResultFailure>> mapSuccess,
Func<TFailure, Result<TResultSuccess, TResultFailure>> mapFailure)
where TResultFailure : struct
=>
InnerFold(
mapSuccess ?? throw new ArgumentNullException(nameof(mapSuccess)),
mapFailure ?? throw new ArgumentNullException(nameof(mapFailure)));

private AsyncPipeline<TResultSuccess, TResultFailure> InnerFold<TResultSuccess, TResultFailure>(
Func<TSuccess, Result<TResultSuccess, TResultFailure>> mapSuccess,
Func<TFailure, Result<TResultSuccess, TResultFailure>> mapFailure)
where TResultFailure : struct
=>
new(
pipeline.InternalPipe(
r => r.Fold(mapSuccess, mapFailure)));
}
private AsyncPipeline<TResultSuccess, TResultFailure> InnerFold<TResultSuccess, TResultFailure>(
Func<TSuccess, Result<TResultSuccess, TResultFailure>> mapSuccess,
Func<TFailure, Result<TResultSuccess, TResultFailure>> mapFailure)
where TResultFailure : struct
=>
new(
pipeline.InternalPipe(
r => r.Fold(mapSuccess, mapFailure)));
}
Original file line number Diff line number Diff line change
@@ -1,28 +1,27 @@
using System.Threading;
using System.Threading.Tasks;

namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TResultSuccess, TResultFailure> FoldValue<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
InnerFoldValue(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));
public AsyncPipeline<TResultSuccess, TResultFailure> FoldValue<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
InnerFoldValue(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));

private AsyncPipeline<TResultSuccess, TResultFailure> InnerFoldValue<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
new(
pipeline.InternalPipeValue(
(r, t) => r.FoldValueAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t))));
}
private AsyncPipeline<TResultSuccess, TResultFailure> InnerFoldValue<TResultSuccess, TResultFailure>(
Func<TSuccess, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapSuccessAsync,
Func<TFailure, CancellationToken, ValueTask<Result<TResultSuccess, TResultFailure>>> mapFailureAsync)
where TResultFailure : struct
=>
new(
pipeline.InternalPipeValue(
(r, t) => r.FoldValueAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t))));
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,24 @@
using System.Threading;
using System.Threading.Tasks;

namespace System
namespace System;

partial struct AsyncPipeline<TSuccess, TFailure>
{
partial struct AsyncPipeline<TSuccess, TFailure>
{
public AsyncPipeline<TResult> Fold<TResult>(
Func<TSuccess, CancellationToken, Task<TResult>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<TResult>> mapFailureAsync)
=>
InnerFold(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));
public AsyncPipeline<TResult> Fold<TResult>(
Func<TSuccess, CancellationToken, Task<TResult>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<TResult>> mapFailureAsync)
=>
InnerFold(
mapSuccessAsync ?? throw new ArgumentNullException(nameof(mapSuccessAsync)),
mapFailureAsync ?? throw new ArgumentNullException(nameof(mapFailureAsync)));

private AsyncPipeline<TResult> InnerFold<TResult>(
Func<TSuccess, CancellationToken, Task<TResult>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<TResult>> mapFailureAsync)
=>
pipeline.InternalPipe(
(r, t) => r.FoldAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t)));
}
private AsyncPipeline<TResult> InnerFold<TResult>(
Func<TSuccess, CancellationToken, Task<TResult>> mapSuccessAsync,
Func<TFailure, CancellationToken, Task<TResult>> mapFailureAsync)
=>
pipeline.InternalPipe(
(r, t) => r.FoldAsync(
s => mapSuccessAsync.Invoke(s, t),
f => mapFailureAsync.Invoke(f, t)));
}
Loading

0 comments on commit 0ac62ed

Please sign in to comment.