package org.checkerframework.framework.util.typeinference.constraint;

import java.util.Set;

/**
 * AFReducer implementations reduce AFConstraints into one or more "simpler" AFConstraints until
 * these constraints are irreducible.
 *
 * @see
 *     org.checkerframework.framework.util.typeinference.constraint.AFConstraint#isIrreducible(java.util.Set)
 *     <p>There is one AFReducer for each type of AFConstraint.
 */
public interface AFReducer {

    /**
     * Determines if the input constraint should be handled by this reducer. If so: Reduces the
     * constraint into one or more new constraints. Any new constraint that can still be reduced is
     * placed in newConstraints. New irreducible constraints are placed in finish. Return true
     * Return false (indicating that some other reducer needs to handle this constraint) If false is
     * returned, the reducer should NOT place any constraints in newConstraints or finished
     *
     * @param constraint the constraint to reduce
     * @param newConstraints the new constraints that may still need to be reduced
     * @return true if the input constraint was handled by this reducer, false otherwise
     */
    public boolean reduce(AFConstraint constraint, Set<AFConstraint> newConstraints);
}
