package org.shedlang.compiler.util; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; import java.util.function.BiFunction; import java.util.function.Function; public class Iterables { private Iterables() { } public interface OnElement { void accept(T value) throws E; } public interface Between { void call() throws E; } public static List filterToType(Iterable iterable, Class clazz) { var result = new ArrayList(); for (var element : iterable) { if (clazz.isInstance(element)) { result.add(clazz.cast(element)); } } return result; } public static T first(Iterable iterable) { return iterable.iterator().next(); } public static R foldLeft( R initial, Iterable iterable, BiFunction combine ) { R result = initial; for (var element : iterable) { result = combine.apply(result, element); } return result; } public static void forEachInterspersed( Iterable values, OnElement onElement, Between between ) throws E { var first = true; for (var value : values) { if (!first) { between.call(); } onElement.accept(value); first = false; } } public static > List sortedBy( Collection collection, Function key ) { return collection.stream().sorted(Comparator.comparing(key)).toList(); } }