Coverage Summary for Class: Gatherers (dev.suresh)
  | Class | Class, % | Method, % | Branch, % | Line, % | Instruction, % | 
  | Gatherers | 0%
  
  
    (0/1) | 0%
  
  
    (0/7) | 0%
  
  
    (0/4) | 0%
  
  
    (0/19) | 0%
  
  
    (0/97) | 
 package dev.suresh;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Gatherer;
 import java.util.stream.Gatherer.Downstream;
 import java.util.stream.Gatherer.Integrator;
 import java.util.stream.Stream;
 
 public class Gatherers {
 
     static <T, R> Gatherer<T, ?, R> map(Function<T, R> f) {
         Integrator<Void, T, R> integrator = (_, e, ds) -> {
             var ir = f.apply(e);
             return ds.push(ir);
         };
         return Gatherer.of(integrator);
     }
 
     static <T> Gatherer<T, List<T>, List<T>> group(int size) {
         Supplier<List<T>> initializer = ArrayList::new;
         Integrator<List<T>, T, List<T>> integrator = (list, e, ds) -> {
             list.add(e);
             if (list.size() < size) {
                 return true;
             } else {
                 var group = List.copyOf(list);
                 list.clear();
                 return ds.push(group);
             }
         };
         BiConsumer<List<T>, Downstream<? super List<T>>> finisher = (list, ds) -> {
             var group = List.copyOf(list);
             if (!group.isEmpty()) {
                 ds.push(group);
             }
         };
         return Gatherer.ofSequential(initializer, integrator, finisher);
     }
 
     static void main(String[] args) {
         Stream.of(1, 2, 3, 4, 5).gather(map(e -> e + 1)).gather(group(2)).forEach(System.out::println);
     }
 }