package openmods.inventory;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import java.util.List;
import net.minecraft.item.ItemStack;
import openmods.inventory.comparator.EqualComponents;
import openmods.inventory.comparator.EqualComponents.IItemStackTester;
public class StackEqualityTesterBuilder {
public interface IEqualityTester {
public boolean isEqual(Object left, Object right);
}
private boolean usedItem;
private boolean usedItemId;
private boolean usedDamage;
private boolean usedSize;
private boolean usedNBT;
private List<IItemStackTester> testers = Lists.newArrayList();
public StackEqualityTesterBuilder useItem() {
Preconditions.checkState(!usedItem);
usedItem = true;
testers.add(EqualComponents.ITEM_TESTER);
return this;
}
public StackEqualityTesterBuilder useItemId() {
Preconditions.checkState(!usedItemId);
usedItemId = true;
testers.add(EqualComponents.ITEM_ID_TESTER);
return this;
}
public StackEqualityTesterBuilder useDamage() {
Preconditions.checkState(!usedDamage);
usedDamage = true;
testers.add(EqualComponents.DAMAGE_TESTER);
return this;
}
public StackEqualityTesterBuilder useSize() {
Preconditions.checkState(!usedSize);
usedSize = true;
testers.add(EqualComponents.SIZE_TESTER);
return this;
}
public StackEqualityTesterBuilder useNBT() {
Preconditions.checkState(!usedNBT);
usedNBT = true;
testers.add(EqualComponents.NBT_TESTER);
return this;
}
public IEqualityTester build() {
final List<IItemStackTester> frozenTesters = ImmutableList.copyOf(testers);
return new IEqualityTester() {
@Override
public boolean isEqual(Object left, Object right) {
if (left == right) return true;
if ((left instanceof ItemStack) && (right instanceof ItemStack)) {
for (IItemStackTester tester : frozenTesters)
if (!tester.isEqual((ItemStack)left, (ItemStack)right)) return false;
return true;
}
return false;
}
};
}
public Predicate<ItemStack> buildPredicate(ItemStack template) {
final ItemStack copy = template.copy();
final IEqualityTester tester = build();
return new Predicate<ItemStack>() {
@Override
public boolean apply(ItemStack input) {
return tester.isEqual(copy, input);
}
};
}
}