class RateLimitedBatcher implements Observable.Operator<Batch<T, I>, T> {

    public static <T extends Batchable<?>, I> RateLimitedBatcher<T, I> create(TokenBucket tokenBucket,
                                                                              long initialDelay,
                                                                              long maxDelay,
                                                                              IndexExtractor<T, I> indexExtractor,
                                                                              EmissionStrategy emissionStrategy,
                                                                              String metricsRoot,
                                                                              Registry registry,
                                                                              Scheduler scheduler) {
        return new RateLimitedBatcher<T, I>(tokenBucket, initialDelay, maxDelay, indexExtractor, emissionStrategy, metricsRoot, registry, scheduler);
    }

    private  RateLimitedBatcher(TokenBucket tokenBucket,
                               long initialDelay,
                               long maxDelay,
                               IndexExtractor<T, I> indexExtractor,
                               EmissionStrategy emissionStrategy,
                               String metricsRoot,
                               Registry registry,
                               Scheduler scheduler);

}