001package org.openstreetmap.josm.tools;
002
003import java.util.Collection;
004import java.util.Objects;
005import java.util.regex.Pattern;
006
007import org.openstreetmap.josm.data.osm.OsmPrimitive;
008
009/**
010 * Utility class for creating {@link Predicate}s.
011 */
012public final class Predicates {
013
014    private Predicates() {
015    }
016
017    /**
018     * Returns the negation of {@code predicate}.
019     */
020    public static <T> Predicate<T> not(final Predicate<T> predicate) {
021        return new Predicate<T>() {
022            @Override
023            public boolean evaluate(T obj) {
024                return !predicate.evaluate(obj);
025            }
026        };
027    }
028
029    /**
030     * Returns a {@link Predicate} executing {@link Objects#equals}.
031     */
032    public static <T> Predicate<T> equalTo(final T ref) {
033        return new Predicate<T>() {
034            @Override
035            public boolean evaluate(T obj) {
036                return Objects.equals(obj, ref);
037            }
038        };
039    }
040
041    /**
042     * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}.
043     */
044    public static Predicate<String> stringMatchesPattern(final Pattern pattern) {
045        return new Predicate<String>() {
046            @Override
047            public boolean evaluate(String string) {
048                return pattern.matcher(string).matches();
049            }
050        };
051    }
052
053    /**
054     * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find}.
055     */
056    public static Predicate<String> stringContainsPattern(final Pattern pattern) {
057        return new Predicate<String>() {
058            @Override
059            public boolean evaluate(String string) {
060                return pattern.matcher(string).find();
061            }
062        };
063    }
064
065    /**
066     * Returns a {@link Predicate} executing {@link String#contains(CharSequence)}.
067     */
068    public static Predicate<String> stringContains(final String pattern) {
069        return new Predicate<String>() {
070            @Override
071            public boolean evaluate(String string) {
072                return string.contains(pattern);
073            }
074        };
075    }
076
077    /**
078     * Returns a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)}.
079     */
080    public static Predicate<OsmPrimitive> hasTag(final String key, final String... values) {
081        return new Predicate<OsmPrimitive>() {
082            @Override
083            public boolean evaluate(OsmPrimitive p) {
084                return p.hasTag(key, values);
085            }
086        };
087    }
088
089    /**
090     * Returns a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)}.
091     */
092    public static Predicate<OsmPrimitive> hasKey(final String key) {
093        return new Predicate<OsmPrimitive>() {
094            @Override
095            public boolean evaluate(OsmPrimitive p) {
096                return p.hasKey(key);
097            }
098        };
099    }
100
101    /**
102     * Returns a {@link Predicate} executing {@link Collection#contains(Object)}.
103     */
104    public static <T> Predicate<T> inCollection(final Collection<? extends T> target) {
105        return new Predicate<T>() {
106            @Override
107            public boolean evaluate(T object) {
108                return target.contains(object);
109            }
110        };
111    }
112
113    /**
114     * Returns a {@link Predicate} testing whether objects are {@code null}.
115     */
116    public static <T> Predicate<T> isNull() {
117        return new Predicate<T>() {
118            @Override
119            public boolean evaluate(T object) {
120                return object == null;
121            }
122        };
123    }
124}