use of mb.nabl2.constraints.sets.CDistinct in project nabl by metaborg.
the class SetComponent method solve.
private Optional<SolveResult> solve(CDistinct constraint) {
ITerm setTerm = unifier().findRecursive(constraint.getSet());
if (!setTerm.isGround()) {
return Optional.empty();
}
Optional<Set<IElement<ITerm>>> maybeSet = evaluator.match(setTerm, unifier());
if (!(maybeSet.isPresent())) {
return Optional.empty();
}
Multimap<Object, IElement<ITerm>> proj = SetEvaluator.project(maybeSet.get(), constraint.getProjection());
List<IElement<ITerm>> duplicates = Lists.newArrayList();
for (Object key : proj.keySet()) {
Collection<IElement<ITerm>> values = proj.get(key);
if (values.size() > 1) {
duplicates.addAll(values);
}
}
if (duplicates.isEmpty()) {
return Optional.of(SolveResult.empty());
} else {
MessageContent content = MessageContent.builder().append(B.newAppl(NAME_OP)).append(" has duplicates in ").append(setTerm).build();
Iterable<IMessageInfo> messages = makeMessages(constraint.getMessageInfo().withDefaultContent(content), duplicates);
return Optional.of(SolveResult.messages(messages));
}
}
Aggregations