// Path: src/main/java/io/taciturn/Utility.java
// public static <Item> ClassUtility<Item> $(Class<Item> object) {
//     return new ClassUtility<>(object);
// }


import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.Vector;
import java.util.function.Predicate;
import java.util.stream.Stream;
import static io.taciturn.Utility.$;
package io.taciturn.utility;



/**
 * Utility functions that apply to all objects.
 *
 * @param <Item> The type of object to augment.
 */
public class ObjectUtility<Item> extends AbstractUtility<Item> {

    /**
     * Constructor for the utility object.
     *
     * @param object The object to augment.
     */
    public ObjectUtility(Item object) {
        super(object);
    }

    /**
     * Retrieves the fields for a particular object, limited by the predicate provided.
     * @param filter The {@link Predicate} that limits what fields to retrieve.
     * @return the utility that wraps the collection of {@link FieldUtility} objects.
     */
    public StreamUtility<FieldUtility> getFields(Predicate<Field> filter) {
        return map(Object::getClass)
                .map(Class::getDeclaredFields)
// Path: src/main/java/io/taciturn/Utility.java
// public static <Item> ClassUtility<Item> $(Class<Item> object) {
//     return new ClassUtility<>(object);
// }


// Path: src/main/java/io/taciturn/utility/ObjectUtility.java
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.Vector;
import java.util.function.Predicate;
import java.util.stream.Stream;
import static io.taciturn.Utility.$;

package io.taciturn.utility;



/**
 * Utility functions that apply to all objects.
 *
 * @param <Item> The type of object to augment.
 */
public class ObjectUtility<Item> extends AbstractUtility<Item> {

    /**
     * Constructor for the utility object.
     *
     * @param object The object to augment.
     */
    public ObjectUtility(Item object) {
        super(object);
    }

    /**
     * Retrieves the fields for a particular object, limited by the predicate provided.
     * @param filter The {@link Predicate} that limits what fields to retrieve.
     * @return the utility that wraps the collection of {@link FieldUtility} objects.
     */
    public StreamUtility<FieldUtility> getFields(Predicate<Field> filter) {
        return map(Object::getClass)
                .map(Class::getDeclaredFields)
                .map(o -> $(o)