Я пытаюсь обойти отсутствие collection.mutable.SortedSet
, какова была бы моя реализация списка пропусков.Я почти там:
import collection.{SortedSet => CSortedSet, SortedSetLike => CSortedSetLike}
import collection.mutable.{Set => MSet, SetLike => MSetLike}
import collection.generic.{MutableSetFactory, GenericCompanion}
object SkipList extends MutableSetFactory[SkipList] {
def empty[A](implicit ord: Ordering[A]): SkipList[A] = ???
}
trait SkipList[A] extends MSet[A] with MSetLike[A, SkipList[A]] with CSortedSet[A]
with CSortedSetLike[A, SkipList[A]] {
override def empty: SkipList[A] = SkipList.empty[A](ordering)
def rangeImpl(from: Option[A], until: Option[A]): SkipList[A] =
throw new Exception("Unsupported operation")
}
Хорошо, это компилируется.Но в отличие от неизменяемого отсортированного набора, где я могу однозначно сделать
case class Holder(i: Int) extends Ordered[Holder] {
def compare(b: Holder) = i.compare(b.i)
}
def test1(iss: ISortedSet[Holder]) = iss.map(_.i)
test1(ISortedSet(Holder(4), Holder(77), Holder(-2))).toList
, это невозможно для моего изменяемого сортированного набора:
def test2(sl: SkipList[Holder]) = sl.map(_.i)
с
error: ambiguous implicit values:
both method canBuildFrom in object SortedSet of type [A](implicit ord: Ordering[A])scala.collection.generic.CanBuildFrom[scala.collection.SortedSet.Coll,A,scala.collection.SortedSet[A]]
and method canBuildFrom in object Set of type [A]=> scala.collection.generic.CanBuildFrom[scala.collection.mutable.Set.Coll,A,scala.collection.mutable.Set[A]]
match expected type scala.collection.generic.CanBuildFrom[SkipList[Holder],Int,That]
def test2( sl: SkipList[ Holder ]) = sl.map( _.i )
^
Этоза пределами моего обзора.Любые подсказки о том, как добиться того, что уже делает неизменный отсортированный набор?Есть ли шанс, что я смогу устранить эту двусмысленность?