onstrutor específico para o tipo parametriza
Estou tentando escrever uma classe no scala que agrupe uma coleção (parametrizada) e substitua seu método foreach. O que ele faz com o método foreach não é importante para o objetivo desta pergunta, então digamos que apenas imprima cada elemento à medida que é visitado. Idealmente, poderíamos usar o wrapper da seguinte maneira:
scala> val a = List(1,2,3,4,5)
scala> val b = MyWrapper(a)
scala> b.foreach{ x => x }
1
2
3
4
5
A chave é que eu quero que isso funcione com qualquer iterável; não apenas uma lista. Então, minha primeira tentativa foi algo como o que se segue
class MyWrapper[A, S[A] <: Iterable[A]]( val s: S[A] with IterableLike[A, S[A]])
extends IterableLike[A, S[A]] {
override def foreach[U](f: A => U): Unit = {
iterator.foreach{ x => println(x); f(x) }
}
}
No entanto, para que essa classe seja concreta, precisamos de um método iterador e um método newBuilder. O método iterador não é problema, podemos apenas "roubar" o iterador da seguinte maneira:
override def iterator = s.iterator
O problema é quando tento definir o newBuilder. Eu preciso que o construtor retorne um S [A]. No entanto, S [A] é uma coleção parametrizada que é delimitada por Iterable [A]. Portanto, todas as minhas tentativas de usar o genericBuilder ou obter o construtor do objeto complementar resultam em um Iterável [A] em vez de um S [A], com as mensagens de erro correspondentes
[error] method newBuilder in trait TraversableLike of type => scala.collection.mutable.Builder[A,S[A]] is not defined
[error] method seq in trait Parallelizable of type => scala.collection.TraversableOnce[A] is not defined
Como posso obter um construtor que construa o tipo específico, S [A], em vez do tipo delimitado genérico Iterável [A]? Isso é possível? Qualquer ajuda para entender a maneira idiomática do Scala de fazer isso (ou de qualquer maneira que realmente funcione) seria muito apreciada!