/*
* SPDX-FileCopyrightText: 2023 The Refinery Authors
*
* SPDX-License-Identifier: EPL-2.0
*/
package tools.refinery.store.reasoning.translator.opposite;
import tools.refinery.store.map.AnyVersionedMap;
import tools.refinery.store.map.Cursor;
import tools.refinery.store.reasoning.ReasoningAdapter;
import tools.refinery.store.reasoning.interpretation.AbstractPartialInterpretation;
import tools.refinery.store.reasoning.interpretation.PartialInterpretation;
import tools.refinery.store.reasoning.literal.Concreteness;
import tools.refinery.store.reasoning.representation.PartialSymbol;
import tools.refinery.store.tuple.Tuple;
import java.util.Set;
class OppositeInterpretation extends AbstractPartialInterpretation {
private final PartialInterpretation opposite;
private OppositeInterpretation(ReasoningAdapter adapter, Concreteness concreteness,
PartialSymbol partialSymbol, PartialInterpretation opposite) {
super(adapter, concreteness, partialSymbol);
this.opposite = opposite;
}
@Override
public A get(Tuple key) {
return opposite.get(OppositeUtils.flip(key));
}
@Override
public Cursor getAll() {
return new OppositeCursor<>(opposite.getAll());
}
public static Factory of(PartialSymbol oppositeSymbol) {
return (adapter, concreteness, partialSymbol) -> {
var opposite = adapter.getPartialInterpretation(concreteness, oppositeSymbol);
return new OppositeInterpretation<>(adapter, concreteness, partialSymbol, opposite);
};
}
private record OppositeCursor(Cursor opposite) implements Cursor {
@Override
public Tuple getKey() {
return OppositeUtils.flip(opposite.getKey());
}
@Override
public T getValue() {
return opposite.getValue();
}
@Override
public boolean isTerminated() {
return opposite.isTerminated();
}
@Override
public boolean move() {
return opposite.move();
}
@Override
public Set getDependingMaps() {
return opposite.getDependingMaps();
}
@Override
public boolean isDirty() {
return opposite.isDirty();
}
}
}