I am not sure I understand the issue?  I think a fold could be slightly more efficient since it allows for an additional transformation.  Are you thinking something like:

```scala
def groupEdges[C: ClassManifest](createCombiner: ED => C, fold: (C, ED) => C, combine: (C,C) => C)
```

actually for the purpose of computing the neighborhood set more efficiently we could probably benefit from a similar version of `mapReduceTriplets`.