File size: 1,641 Bytes
d46f4a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package net.minecraft.advancements.critereon;

import com.google.common.collect.Iterables;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.Optional;
import java.util.function.Predicate;

public record CollectionPredicate<T, P extends Predicate<T>>(
    Optional<CollectionContentsPredicate<T, P>> contains, Optional<CollectionCountsPredicate<T, P>> counts, Optional<MinMaxBounds.Ints> size
) implements Predicate<Iterable<T>> {
    public static <T, P extends Predicate<T>> Codec<CollectionPredicate<T, P>> codec(Codec<P> p_330735_) {
        return RecordCodecBuilder.create(
            p_335025_ -> p_335025_.group(
                        CollectionContentsPredicate.<T, P>codec(p_330735_).optionalFieldOf("contains").forGetter(CollectionPredicate::contains),
                        CollectionCountsPredicate.<T, P>codec(p_330735_).optionalFieldOf("count").forGetter(CollectionPredicate::counts),
                        MinMaxBounds.Ints.CODEC.optionalFieldOf("size").forGetter(CollectionPredicate::size)
                    )
                    .apply(p_335025_, CollectionPredicate::new)
        );
    }

    public boolean test(Iterable<T> p_332418_) {
        if (this.contains.isPresent() && !this.contains.get().test(p_332418_)) {
            return false;
        } else {
            return this.counts.isPresent() && !this.counts.get().test(p_332418_)
                ? false
                : !this.size.isPresent() || this.size.get().matches(Iterables.size(p_332418_));
        }
    }
}