package com.googlecode.totallylazy; import com.googlecode.totallylazy.functions.Function1; import com.googlecode.totallylazy.predicates.Predicate; public class Rule<A, B> implements Function1<A, B>, Predicate<A> { private final Predicate<? super A> predicate; private final Function1<? super A, ? extends B> callable; private Rule(final Predicate<? super A> predicate, final Function1<? super A, ? extends B> callable) { this.predicate = predicate; this.callable = callable; } public static <A, B> Rule<A, B> rule(final Predicate<? super A> predicate, final Function1<? super A, ? extends B> callable) { return new Rule<A, B>(predicate, callable); } @Override public boolean matches(final A value) { return predicate.matches(value); } @Override public B call(final A input) throws Exception { return callable.call(input); } }