function wrapIterable<T>(
    iterable: AsyncIterable<T>,
    onEnds: Array<NonNullable<MiddlewareResult['onEnd']>>,
    onItems: Array<NonNullable<MiddlewareResult['onItem']>>,
): FluentAsyncIterable<T> {