|
| 1 | +package scala.collection.compat |
| 2 | + |
| 3 | +import scala.collection.generic._ |
| 4 | +import scala.reflect.ClassTag |
| 5 | +import scala.collection.{MapLike, GenTraversable, BitSet} |
| 6 | +import scala.collection.{immutable => i, mutable => m} |
| 7 | +import scala.{collection => c} |
| 8 | + |
| 9 | +/** The collection compatibility API */ |
| 10 | +private[compat] trait PackageShared { |
| 11 | + import CompatImpl._ |
| 12 | + |
| 13 | + implicit def genericCompanionToCBF[A, CC[X] <: GenTraversable[X]]( |
| 14 | + fact: GenericCompanion[CC]): CanBuildFrom[Any, A, CC[A]] = |
| 15 | + simpleCBF(fact.newBuilder[A]) |
| 16 | + |
| 17 | + implicit def sortedSetCompanionToCBF[ |
| 18 | + A: Ordering, |
| 19 | + CC[X] <: c.SortedSet[X] with c.SortedSetLike[X, CC[X]]]( |
| 20 | + fact: SortedSetFactory[CC]): CanBuildFrom[Any, A, CC[A]] = |
| 21 | + simpleCBF(fact.newBuilder[A]) |
| 22 | + |
| 23 | + implicit def arrayCompanionToCBF[A: ClassTag]( |
| 24 | + fact: Array.type): CanBuildFrom[Any, A, Array[A]] = |
| 25 | + simpleCBF(Array.newBuilder[A]) |
| 26 | + |
| 27 | + implicit def mapFactoryToCBF[ |
| 28 | + K, |
| 29 | + V, |
| 30 | + CC[A, B] <: Map[A, B] with MapLike[A, B, CC[A, B]]]( |
| 31 | + fact: MapFactory[CC]): CanBuildFrom[Any, (K, V), CC[K, V]] = |
| 32 | + simpleCBF(fact.newBuilder[K, V]) |
| 33 | + |
| 34 | + implicit def sortedMapFactoryToCBF[ |
| 35 | + K: Ordering, |
| 36 | + V, |
| 37 | + CC[A, B] <: c.SortedMap[A, B] with c.SortedMapLike[A, B, CC[A, B]]]( |
| 38 | + fact: SortedMapFactory[CC]): CanBuildFrom[Any, (K, V), CC[K, V]] = |
| 39 | + simpleCBF(fact.newBuilder[K, V]) |
| 40 | + |
| 41 | + implicit def bitSetFactoryToCBF( |
| 42 | + fact: BitSetFactory[BitSet]): CanBuildFrom[Any, Int, BitSet] = |
| 43 | + simpleCBF(fact.newBuilder) |
| 44 | + |
| 45 | + implicit def immutableBitSetFactoryToCBF(fact: BitSetFactory[i.BitSet]) |
| 46 | + : CanBuildFrom[Any, Int, ImmutableBitSetCC[Int]] = |
| 47 | + simpleCBF(fact.newBuilder) |
| 48 | + |
| 49 | + implicit def mutableBitSetFactoryToCBF(fact: BitSetFactory[m.BitSet]) |
| 50 | + : CanBuildFrom[Any, Int, MutableBitSetCC[Int]] = |
| 51 | + simpleCBF(fact.newBuilder) |
| 52 | + |
| 53 | + implicit class IterableFactoryExtensionMethods[CC[X] <: GenTraversable[X]]( |
| 54 | + private val fact: GenericCompanion[CC]) { |
| 55 | + def from[A](source: TraversableOnce[A]): CC[A] = |
| 56 | + fact.apply(source.toSeq: _*) |
| 57 | + } |
| 58 | + |
| 59 | + implicit class MapFactoryExtensionMethods[ |
| 60 | + CC[A, B] <: Map[A, B] with MapLike[A, B, CC[A, B]]]( |
| 61 | + private val fact: MapFactory[CC]) { |
| 62 | + def from[K, V](source: TraversableOnce[(K, V)]): CC[K, V] = |
| 63 | + fact.apply(source.toSeq: _*) |
| 64 | + } |
| 65 | + |
| 66 | + implicit class BitSetFactoryExtensionMethods[ |
| 67 | + C <: scala.collection.BitSet with scala.collection.BitSetLike[C]]( |
| 68 | + private val fact: BitSetFactory[C]) { |
| 69 | + def fromSpecific(source: TraversableOnce[Int]): C = |
| 70 | + fact.apply(source.toSeq: _*) |
| 71 | + } |
| 72 | + |
| 73 | + private[compat] def build[T, CC](builder: m.Builder[T, CC], |
| 74 | + source: TraversableOnce[T]): CC = { |
| 75 | + builder ++= source |
| 76 | + builder.result() |
| 77 | + } |
| 78 | + |
| 79 | + // This really belongs into scala.collection but there's already a package object |
| 80 | + // in scala-library so we can't add to it |
| 81 | + type IterableOnce[+X] = c.TraversableOnce[X] |
| 82 | + val IterableOnce = c.TraversableOnce |
| 83 | +} |
| 84 | + |
| 85 | +class ImmutableSortedMapExtensions(private val fact: i.SortedMap.type) extends AnyVal { |
| 86 | + def from[K: Ordering, V](source: TraversableOnce[(K, V)]): i.SortedMap[K, V] = |
| 87 | + build(i.SortedMap.newBuilder[K, V], source) |
| 88 | +} |
| 89 | + |
| 90 | +class ImmutableListMapExtensions(private val fact: i.ListMap.type) extends AnyVal { |
| 91 | + def from[K, V](source: TraversableOnce[(K, V)]): i.ListMap[K, V] = |
| 92 | + build(i.ListMap.newBuilder[K, V], source) |
| 93 | +} |
| 94 | + |
| 95 | +class ImmutableHashMapExtensions(private val fact: i.HashMap.type) extends AnyVal { |
| 96 | + def from[K, V](source: TraversableOnce[(K, V)]): i.HashMap[K, V] = |
| 97 | + build(i.HashMap.newBuilder[K, V], source) |
| 98 | +} |
| 99 | + |
| 100 | +class ImmutableTreeMapExtensions(private val fact: i.TreeMap.type) extends AnyVal { |
| 101 | + def from[K: Ordering, V](source: TraversableOnce[(K, V)]): i.TreeMap[K, V] = |
| 102 | + build(i.TreeMap.newBuilder[K, V], source) |
| 103 | +} |
| 104 | + |
| 105 | +class ImmutableIntMapExtensions(private val fact: i.IntMap.type) extends AnyVal { |
| 106 | + def from[V](source: TraversableOnce[(Int, V)]): i.IntMap[V] = |
| 107 | + build(i.IntMap.canBuildFrom[Int, V](), source) |
| 108 | +} |
| 109 | + |
| 110 | +class ImmutableLongMapExtensions(private val fact: i.LongMap.type) extends AnyVal { |
| 111 | + def from[V](source: TraversableOnce[(Long, V)]): i.LongMap[V] = |
| 112 | + build(i.LongMap.canBuildFrom[Long, V](), source) |
| 113 | +} |
| 114 | + |
| 115 | +class MutableLongMapExtensions(private val fact: m.LongMap.type) extends AnyVal { |
| 116 | + def from[V](source: TraversableOnce[(Long, V)]): m.LongMap[V] = |
| 117 | + build(m.LongMap.canBuildFrom[Long, V](), source) |
| 118 | +} |
| 119 | + |
| 120 | +class MutableHashMapExtensions(private val fact: m.HashMap.type) extends AnyVal { |
| 121 | + def from[K, V](source: TraversableOnce[(K, V)]): m.HashMap[K, V] = |
| 122 | + build(m.HashMap.canBuildFrom[K, V](), source) |
| 123 | +} |
| 124 | + |
| 125 | +class MutableListMapExtensions(private val fact: m.ListMap.type) extends AnyVal { |
| 126 | + def from[K, V](source: TraversableOnce[(K, V)]): m.ListMap[K, V] = |
| 127 | + build(m.ListMap.canBuildFrom[K, V](), source) |
| 128 | +} |
| 129 | + |
| 130 | +class MutableMapExtensions(private val fact: m.Map.type) extends AnyVal { |
| 131 | + def from[K, V](source: TraversableOnce[(K, V)]): m.Map[K, V] = |
| 132 | + build(m.Map.canBuildFrom[K, V](), source) |
| 133 | +} |
| 134 | + |
| 135 | +class StreamExtensionMethods[A](private val stream: Stream[A]) extends AnyVal { |
| 136 | + def lazyAppendedAll(as: => TraversableOnce[A]): Stream[A] = stream.append(as) |
| 137 | +} |
| 138 | + |
| 139 | +class SortedExtensionMethods[K, T <: Sorted[K, T]](private val fact: Sorted[K, T]) { |
| 140 | + def rangeFrom(from: K): T = fact.from(from) |
| 141 | + def rangeTo(to: K): T = fact.to(to) |
| 142 | + def rangeUntil(until: K): T = fact.until(until) |
| 143 | +} |
| 144 | + |
| 145 | +class IteratorExtensionMethods[A](private val self: c.Iterator[A]) extends AnyVal { |
| 146 | + def sameElements[B >: A](that: c.TraversableOnce[B]): Boolean = { |
| 147 | + self.sameElements(that.iterator) |
| 148 | + } |
| 149 | + def concat[B >: A](that: c.TraversableOnce[B]): c.TraversableOnce[B] = self ++ that |
| 150 | +} |
| 151 | + |
| 152 | +class TraversableOnceExtensionMethods[A](private val self: c.TraversableOnce[A]) extends AnyVal { |
| 153 | + def iterator: Iterator[A] = self.toIterator |
| 154 | +} |
0 commit comments