groupFlatMap combinator

Proposal to add groupFlatMap for every groupMap

def groupFlatMap[K, B](key: A => K)(f: A => IterableOnce[B]): immutable.Map[K, CC[B]]

is to

def groupMap[K, B](key: A => K)(f: A => B): immutable.Map[K, CC[B]]

as

def flatMap[B](f: A => IterableOnce[B]): CC[B]

is to

def map[B](f: A => B): CC[B]

Would groupFlatMapReduce also be useful?

After further thought, maybe its not obvious what would happen if IterableOnce is empty.

1 Like

Can you provide some examples of when these would be useful?

This can be (mostly) implemented in terms of groupMapReduce:

def groupFlatMap[A, K, B](as: Iterable[A])(key: A => K)(f: A => IterableOnce[B]): Map[K, Iterable[B]] =
  as.groupMapReduce(key)(a => View.from(f(a)))(_ ++ _)

It is not (yet?) possible to supply a Factory for building groups (here, I use View but it would be nice to build anything and in an efficient way), so the return type is Map[K, Iterable[B]] instead of something more specific.

Note that, as you noted, an important difference with the classic groupBy operations, is that with groupFlatMap groups can be empty.