FallbackEngine
using System;
using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Threading;
namespace Polly.Fallback
{
    internal static class FallbackEngine
    {
        [System.Runtime.CompilerServices.NullableContext(1)]
        [System.Diagnostics.DebuggerDisableUserUnhandledExceptions]
        internal static TResult Implementation<[System.Runtime.CompilerServices.Nullable(2)] TResult>(Func<Context, CancellationToken, TResult> action, Context context, ExceptionPredicates shouldHandleExceptionPredicates, ResultPredicates<TResult> shouldHandleResultPredicates, Action<DelegateResult<TResult>, Context> onFallback, Func<DelegateResult<TResult>, Context, CancellationToken, TResult> fallbackAction, CancellationToken cancellationToken)
        {
            DelegateResult<TResult> arg;
            try {
                cancellationToken.ThrowIfCancellationRequested();
                TResult result = action(context, cancellationToken);
                if (!shouldHandleResultPredicates.AnyMatch(result))
                    return result;
                arg = new DelegateResult<TResult>(result);
            } catch (Exception ex) {
                Exception ex2 = shouldHandleExceptionPredicates.FirstMatchOrDefault(ex);
                if (ex2 == null)
                    throw;
                arg = new DelegateResult<TResult>(ex2);
            }
            onFallback(arg, context);
            return fallbackAction(arg, context, cancellationToken);
        }
    }
}