001package de.monochromata.anaphors.ast.unify;
002
003import static de.monochromata.anaphors.ast.reference.strategy.concept.FauxHyponymy.HyFx_KIND;
004import static de.monochromata.anaphors.ast.reference.strategy.concept.Hyponymy.Hy_KIND;
005import static de.monochromata.anaphors.ast.unify.Unification.haveEqualReferent;
006import static de.monochromata.anaphors.ast.unify.Unification.unifyListElements;
007
008import java.util.List;
009import java.util.function.BiPredicate;
010
011import de.monochromata.anaphors.ast.ASTBasedAnaphora;
012import de.monochromata.anaphors.ast.relatedexp.RelatedExpression;
013
014public interface HyponymyPrecedesFauxHyponymy {
015
016        static <N, E, T, B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>, A extends ASTBasedAnaphora<N, E, T, B, TB, S, I, QI, R, A>> List<A> preferHynonymyOverFauxHyponymy(
017                        final List<A> potentialAnaphoraRelations) {
018                return unifyListElements(potentialAnaphoraRelations, preferHyOverHyFx());
019        }
020
021        static <N, E, T, B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>, A extends ASTBasedAnaphora<N, E, T, B, TB, S, I, QI, R, A>> BiPredicate<A, A> preferHyOverHyFx() {
022                return (anaphora1, anaphora2) -> haveHyAndHyFx(anaphora1, anaphora2) && haveEqualReferent(anaphora1, anaphora2);
023        }
024
025        private static <N, E, T, B, TB extends B, S, I, QI, R extends RelatedExpression<N, T, B, TB, S, QI, R>, A extends ASTBasedAnaphora<N, E, T, B, TB, S, I, QI, R, A>> boolean haveHyAndHyFx(
026                        final A anaphora1, final A anaphora2) {
027                return anaphora1.getReferentializationStrategy().getKind().equals(Hy_KIND)
028                                && anaphora2.getReferentializationStrategy().getKind().equals(HyFx_KIND);
029        }
030
031}