using System; using System.Collections.Generic; using System.Diagnostics.Eventing.Reader; using System.Threading.Tasks; namespace Tapeti.Helpers { public static class MiddlewareHelper { public static void Go(IReadOnlyList middleware, Action handle, Action lastHandler) { var handlerIndex = middleware.Count - 1; if (handlerIndex == -1) { lastHandler(); return; } Action handleNext = null; handleNext = () => { handlerIndex--; if (handlerIndex >= 0) handle(middleware[handlerIndex], handleNext); else lastHandler(); }; handle(middleware[handlerIndex], handleNext); } public static async Task GoAsync(IReadOnlyList middleware, Func, Task> handle, Func lastHandler) { var handlerIndex = middleware.Count - 1; if (handlerIndex == -1) { await lastHandler(); return; } Func handleNext = null; handleNext = async () => { handlerIndex--; if (handlerIndex >= 0) await handle(middleware[handlerIndex], handleNext); else await lastHandler(); }; await handle(middleware[handlerIndex], handleNext); } } }