class LargestPerTimeBucket implements EmissionStrategy {

    @Override
    public <T extends Batchable<?>, I> Queue<Batch<T, I>> compute(Stream<Batch<T, I>> candidates) {
        // TODO: break too large candidates by a configurable maxBatchSize

        final Instant now = Instant.ofEpochMilli(scheduler.now());
        final Instant cutLine = now.minus(minimumTimeInQueueMs, ChronoUnit.MILLIS);
        final Stream<Batch<T, I>> inQueueMinimumRequired = candidates.filter(
                batch -> !batch.getOldestItemTimestamp().isAfter(cutLine)
        );

        PriorityQueue<Batch<T, I>> queue = new PriorityQueue<>(this::compare);
        inQueueMinimumRequired.forEach(queue::offer);
        return queue;
    }

    public  LargestPerTimeBucket(long minimumTimeInQueueMs, long timeWindowBucketSizeMs, Scheduler scheduler);

}