package org.zwobble.mammoth.tests; import org.zwobble.mammoth.internal.util.Iterables; import java.util.Iterator; import static java.util.Arrays.asList; public class Arguments { private final Object[] arguments; public Arguments(Object[] arguments) { this.arguments = arguments; } public T get(Class clazz) { return only(getAll(clazz)); } public T get(Class clazz, T defaultValue) { Iterator arguments = getAll(clazz).iterator(); if (!arguments.hasNext()) { return defaultValue; } else { return only(arguments); } } private Iterable getAll(Class clazz) { return Iterables.lazyFilter(asList(arguments), clazz); } private T only(Iterable iterable) { return only(iterable.iterator()); } private T only(Iterator iterator) { T value = iterator.next(); if (iterator.hasNext()) { throw new RuntimeException("Expected exactly one element, but had multiple elements"); } else { return value; } } }