package net.minecraft.advancements.critereon; import com.google.common.collect.Iterables; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import java.util.Optional; import java.util.function.Predicate; public record CollectionPredicate>( Optional> contains, Optional> counts, Optional size ) implements Predicate> { public static > Codec> codec(Codec

testCodec) { return RecordCodecBuilder.create( instance -> instance.group( CollectionContentsPredicate.codec(testCodec).optionalFieldOf("contains").forGetter(CollectionPredicate::contains), CollectionCountsPredicate.codec(testCodec).optionalFieldOf("count").forGetter(CollectionPredicate::counts), MinMaxBounds.Ints.CODEC.optionalFieldOf("size").forGetter(CollectionPredicate::size) ) .apply(instance, CollectionPredicate::new) ); } public boolean test(Iterable collection) { if (this.contains.isPresent() && !((CollectionContentsPredicate)this.contains.get()).test(collection)) { return false; } else { return this.counts.isPresent() && !((CollectionCountsPredicate)this.counts.get()).test(collection) ? false : !this.size.isPresent() || ((MinMaxBounds.Ints)this.size.get()).matches(Iterables.size(collection)); } } }