Skip to content

Instantly share code, notes, and snippets.

@tintoy
Last active March 3, 2016 00:34
Show Gist options
  • Save tintoy/d8320da6a130a33b8476 to your computer and use it in GitHub Desktop.
Save tintoy/d8320da6a130a33b8476 to your computer and use it in GitHub Desktop.
Example of chaining supervision deciders in Akka.NET.
/// <summary>
/// Extension methods for Akka's <see cref="IDecider">decider</see>s.
/// </summary>
public static class DeciderChaining
{
/// <summary>
/// Create a new <see cref="LocalOnlyDecider"/> that first calls the <paramref name="decider"/>, but then calls <paramref name="escalateToDecider"/> if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>.
/// </summary>
/// <param name="decider">
/// The original <see cref="IDecider"/>.
/// </param>
/// <param name="escalateToDecider">
/// The <see cref="LocalOnlyDecider"/> to call if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>.
/// </param>
/// <returns>
/// The new (composite) decider.
/// </returns>
public static LocalOnlyDecider Then(this IDecider decider, Func<Exception, Directive> escalateToDecider)
{
if (decider == null)
throw new ArgumentNullException(nameof(decider));
if (escalateToDecider == null)
throw new ArgumentNullException(nameof(escalateToDecider));
return decider.Then(
Decider.From(escalateToDecider)
);
}
/// <summary>
/// Create a new <see cref="LocalOnlyDecider"/> that first calls the <paramref name="decider"/>, but then calls <paramref name="escalateToDecider"/> if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>.
/// </summary>
/// <param name="decider">
/// The <see cref="LocalOnlyDecider"/>.
/// </param>
/// <param name="escalateToDecider">
/// The <see cref="IDecider">decider</see> to call if the original <paramref name="decider"/> returns <see cref="Directive.Escalate"/>.
/// </param>
/// <returns>
/// The new (composite) decider.
/// </returns>
public static LocalOnlyDecider Then(this IDecider decider, IDecider escalateToDecider)
{
if (decider == null)
throw new ArgumentNullException(nameof(decider));
if (escalateToDecider == null)
throw new ArgumentNullException(nameof(escalateToDecider));
return Decider.From(exception =>
{
Directive directive = decider.Decide(exception);
return directive == Directive.Escalate ? escalateToDecider.Decide(exception) : directive;
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment