001/*-------------------------------------------------------------------------+
002|                                                                          |
003| Copyright 2005-2011 The ConQAT Project                                   |
004|                                                                          |
005| Licensed under the Apache License, Version 2.0 (the "License");          |
006| you may not use this file except in compliance with the License.         |
007| You may obtain a copy of the License at                                  |
008|                                                                          |
009|    http://www.apache.org/licenses/LICENSE-2.0                            |
010|                                                                          |
011| Unless required by applicable law or agreed to in writing, software      |
012| distributed under the License is distributed on an "AS IS" BASIS,        |
013| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
014| See the License for the specific language governing permissions and      |
015| limitations under the License.                                           |
016+-------------------------------------------------------------------------*/
017package org.conqat.lib.commons.predicate;
018
019import java.util.function.Predicate;
020
021/**
022 * Predicate that inverts another predicate.
023 * 
024 * @param <T>
025 *            the element type the predicate works on.
026 */
027public class InvertingPredicate<T> implements Predicate<T> {
028
029        /** The delegate predicate. */
030        private final Predicate<T> inner;
031
032        /** Constructor. */
033        public InvertingPredicate(Predicate<T> inner) {
034                this.inner = inner;
035        }
036
037        /** {@inheritDoc} */
038        @Override
039        public boolean test(T element) {
040                return !inner.test(element);
041        }
042
043        /**
044         * Factory method for creating an inverting predicate. This is used to exploit
045         * generic type inference (i.e. syntactic reasons).
046         */
047        public static <T> InvertingPredicate<T> create(Predicate<T> inner) {
048                return new InvertingPredicate<T>(inner);
049        }
050}