static Tuple2<Either<Set<ParseFailedException>, Term>, Set<VarInfo>> visitPolyChildrenSets(TermCons tc, Function<Term, Tuple2<Either<Set<ParseFailedException>, Term>, Set<VarInfo>>> apply) {
Set<ParseFailedException> errors = new HashSet<>();
Set<VarInfo> info = new HashSet<>();
for (int i : getPolyChildren(tc)) {
Tuple2<Either<Set<ParseFailedException>, Term>, Set<VarInfo>> res = apply.apply(tc.get(i - 1));
info.addAll(res._2());
if (res._1().isLeft())
errors.addAll(res._1().left().get());
}
if (errors.isEmpty())
return Tuple2.apply(Right.apply(tc), info);
else
return Tuple2.apply(Left.apply(errors), info);
}