public static <From, To> To aggregate( IEntityDefn primary, IEntityDefnFoldVisitor<From, To> visitor, IAggregator<From, To> aggregator) { aggregator.add(visitor.acceptPrimary(primary)); visitChildren(primary, visitor, aggregator); return aggregator.result(); }
public static <From, To> To fold( IEntityDefn primary, To initial, IEntityDefnFoldVisitor<From, To> visitor, IFoldFunction<From, To> foldFunction) { To accumulator = foldFunction.apply(visitor.acceptPrimary(primary), initial); return visitChildren(primary, accumulator, visitor, foldFunction); }
private static <To, From> void visitChildren( IEntityDefn parent, IEntityDefnFoldVisitor<From, To> visitor, IAggregator<From, To> aggregator) { for (IEntityDefn child : parent.getChildren()) { aggregator.add(visitor.acceptChild(parent, child)); visitChildren(child, visitor, aggregator); } }
private static <To, From> To visitChildren( IEntityDefn parent, To initial, IEntityDefnFoldVisitor<From, To> visitor, IFoldFunction<From, To> foldFunction) { To accumulator = initial; for (IEntityDefn child : parent.getChildren()) { accumulator = foldFunction.apply(visitor.acceptChild(parent, child), accumulator); accumulator = visitChildren(parent, accumulator, visitor, foldFunction); } return accumulator; }