package org.jtwig.functions.impl.list; import org.jtwig.functions.FunctionRequest; import org.jtwig.functions.SimpleJtwigFunction; import org.jtwig.util.FunctionValueUtils; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import static org.jtwig.util.FunctionValueUtils.getNumber; public class BatchFunction extends SimpleJtwigFunction { @Override public String name() { return "batch"; } @Override public Object execute(FunctionRequest request) { request.minimumNumberOfArguments(2).maximumNumberOfArguments(3); int groupSize = getNumber(request, 1).intValue(); if (request.getNumberOfArguments() == 3) { return batch(request, 0, groupSize, request.get(2)); } else { return batch(request, 0, groupSize); } } private List<List<Object>> batch(FunctionRequest request, int index, int groupSize) { Iterator<Object> iterator = FunctionValueUtils.getCollection(request, index).iterator(); List<List<Object>> result = new ArrayList<>(); while (iterator.hasNext()) { List<Object> batch = new ArrayList<>(); for (int i = 0; i < groupSize; i++) { if (iterator.hasNext()) batch.add(iterator.next()); } result.add(batch); } return result; } public List<List<Object>> batch(FunctionRequest request, int index, int groupSize, Object padding) { Iterator<Object> iterator = FunctionValueUtils.getCollection(request, index).iterator(); List<List<Object>> result = new ArrayList<>(); while (iterator.hasNext()) { List<Object> batch = new ArrayList<>(); for (int i = 0; i < groupSize; i++) { if (iterator.hasNext()) batch.add(iterator.next()); else batch.add(padding); } result.add(batch); } return result; } }