    001package com.hammurapi.extract;
    002
    003
    004/**
    005 * Extractor which maps arguments to the target extractor.
    006 * @author Pavel Vlasov
    007 *
    008 * @param <T>
    009 * @param <V>
    010 * @param <C>
    011 */
    012public class MappedPredicate<T, C> extends MappedExtractor<T, Boolean, C> implements Predicate<T, C> {
    013
    014        /**
    015         * @param target Target extractor
    016         * @param map Index map, e.g. if it is {5, 3} then the first argument
    017         * of this extractor becomes the sixth argument of the target extractor
    018         * and the second argument of this extractor becomes the 4th argument
    019         * of the target extractor.
    020         */
    021        protected MappedPredicate(Predicate<T, C> target, int[] map) {
    022                super(target, map);
    023        }
    024
    025        public static <T,C> Predicate<T,C> mapPredicate(Predicate<T,C> target, int[] map) {
    026                if (ComparisonResult.isOneToOneMapping(map)) {
    027                        return target;
    028                }
    029
    030                // Target is not index-dependent (e.g. constant).
    031                if (target.parameterIndices().isEmpty()) {
    032                        return target;
    033                }
    034                if (target instanceof Mappable) {
    035                        @SuppressWarnings("unchecked")
    036                        Extractor<T, Boolean, C> ret = ((Mappable<T,Boolean,C>) target).map(map);
    037                        if (ret!=null) {
    038                                return ExtractorUtil.wrap(ret);
    039                        }
    040                }
    041
    042                return new MappedPredicate<T, C>(target, map);
    043        }
    044
    045
    046}