public static IAsyncResultEnumerable <TResult, TFailure> SelectMany <TSuccess, TFailure, TBind, TResult>(this IAsyncResultEnumerable <TSuccess, TFailure> source, Func <TSuccess, Task <Result <TBind, TFailure> > > bind, Func <TSuccess, TBind, Task <TResult> > resultSelector)
            where TSuccess : notnull
            where TFailure : notnull
            where TBind : notnull
            where TResult : notnull
        {
            if (bind == null)
            {
                throw new ArgumentNullException(nameof(bind));
            }

            if (resultSelector == null)
            {
                throw new ArgumentNullException(nameof(resultSelector));
            }

            return(source
                   .SelectAsync(result => result
                                .MatchAsync(success =>
                                            bind
                                            .Invoke(success)
                                            .MapAsync(value => resultSelector.Invoke(success, value)),
                                            failure => Task.FromResult(Result.Failure <TResult, TFailure>(failure))
                                            )
                                )
                   .AsAsyncResultEnumerable());
        }
 public static IAsyncResultEnumerable <TSuccess, TFailure> Where <TSuccess, TFailure>(this IAsyncResultEnumerable <TSuccess, TFailure> source, Func <TSuccess, Task <Result <Unit, TFailure> > > failurePredicate)
 => source
 .SelectAsync(value => value
              .BindAsync(success => failurePredicate
                         .Invoke(success)
                         .Select(_ => success)
                         )
              )
 .AsAsyncResultEnumerable();
		public static IAsyncResultEnumerable<TResult, TFailure> Select<TSuccess, TResult, TFailure>(this IAsyncResultEnumerable<TSuccess, TFailure> source, Func<TSuccess, Task<TResult>> selector)
		{
			if (selector == null)
				throw new ArgumentNullException(nameof(selector));

			return source
				.SelectAsync(result => result
					.MatchAsync(
						success => Result.Success<TResult, TFailure>(selector.Invoke(success)),
						failure => Task.FromResult(Result.Failure<TResult, TFailure>(failure))
					)
				)
				.AsAsyncResultEnumerable();
		}