Transpondo coleção-de-coleções arbitrárias em Scala

Eu tenho que freqüentemente transpor uma coleção de coleções "retangulares" em Scala, por exemplo: uma lista de mapas, um mapa de listas, um mapa de mapas, um conjunto de listas, um mapa de conjuntos etc. Já que as coleções podem ser uniformemente visto como um mapeamento de um domínio específico para um co-domínio (por exemplo: uma List [A] / Array [A] é um mapeamento do domínio Int para o co-domínio A, Set [A] é um mapeamento do A domínio para o co-domínio booleano etc.), eu gostaria de escrever uma função genérica, limpa para fazer uma operação de transposição (por exemplo: transformar um mapa de listas para a lista de mapas transposta). No entanto, estou tendo problemas porque, além do operador (), o Scala não parece ter uma API unificada para visualizar coleções de forma abstrata como mapeamentos?

Então acabo escrevendo uma transposição separada para cada tipo de coleção de coleções da seguinte forma:

def transposeMapOfLists[A,B]( mapOfLists: Map[A,List[B]] ) : List[Map[A,B]] = {
  val k = ( mapOfLists keys ) toList
  val l = ( k map { mapOfLists(_) } ) transpose;
  l map {  v => ( k zip v ) toMap }
}

def transposeListOfMaps[A,B]( listOfMaps: List[Map[A,B]]) : Map[A,List[B]] = {
  val k = ( listOfMaps(0) keys ) toList
  val l = ( listOfMaps map { m => k map { m(_) } } ) transpose;
  ( k zip l ) toMap
}

def transposeMapOfMaps[A,B,C]( mapOfMaps: Map[A,Map[B,C]] ) : Map[B,Map[A,C]] = {
  val k = ( mapOfMaps keys ) toList
  val listOfMaps = k map { mapOfMaps(_) }
  val mapOfLists = transposeListOfMaps( listOfMaps )
  mapOfLists map { p => ( p._1, ( k zip p._2 ) toMap ) }
}

Alguém pode me ajudar a unificar esses métodos em uma coleção genérica de coleções? Ele também me ajudará (e tenho certeza que outros) aprenderão alguns recursos úteis do Scala no processo.

ps: Eu ignorei o tratamento de exceções e assumi que a coleta de coleções de entrada é retangular, ou seja, todos os elementos de domínio das coleções internas constituem o mesmo conjunto.

questionAnswers(1)

yourAnswerToTheQuestion