Last active
December 28, 2018 06:59
-
-
Save tiqwab/bc8d372ca489a74b72dd2357e7d6b010 to your computer and use it in GitHub Desktop.
Sample collection implementation with Scala 2.13
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.tiqwab.example.step4 | |
import scala.collection.mutable.ListBuffer | |
import scala.collection.{immutable, mutable, SeqFactory, StrictOptimizedLinearSeqOps} | |
class MyList[+A] private (elems: List[A]) | |
extends immutable.LinearSeq[A] with immutable.LinearSeqOps[A, MyList, MyList[A]] | |
with StrictOptimizedLinearSeqOps[A, MyList, MyList[A]] { | |
// To be overridden in implementations, as said in scala.collection.LinearSeq | |
override def isEmpty: Boolean = elems.isEmpty | |
override def head: A = elems.head | |
override def tail: MyList[A] = new MyList(elems.tail) | |
override def iterator: Iterator[A] = elems.iterator | |
// To be overridden for LinearSeqOps | |
override def iterableFactory: SeqFactory[MyList] = MyList | |
override def toString: String = s"MyList(${elems.mkString(",")})" | |
} | |
object MyList extends SeqFactory[MyList] { | |
override def from[A](source: IterableOnce[A]): MyList[A] = | |
newBuilder[A].addAll(source).result() | |
override def empty[A]: MyList[A] = | |
new MyList(List.empty) | |
override def newBuilder[A]: mutable.Builder[A, MyList[A]] = | |
new ListBuffer[A].mapResult(elems => new MyList(elems)) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.tiqwab.example.step4 | |
import scala.collection.mutable.ListBuffer | |
import scala.collection.{immutable, mutable, MapFactory, StrictOptimizedMapOps} | |
class MyMap[K, +V] private (elems: Map[K, V]) | |
extends immutable.Map[K, V] with immutable.MapOps[K, V, MyMap, MyMap[K, V]] | |
with StrictOptimizedMapOps[K, V, MyMap, MyMap[K, V]] { | |
// Should be implemented for immutable.Map | |
override def remove(key: K): MyMap[K, V] = | |
new MyMap(elems.remove(key)) | |
override def updated[V1 >: V](key: K, value: V1): MyMap[K, V1] = | |
new MyMap(elems.updated(key, value)) | |
override def get(key: K): Option[V] = | |
elems.get(key) | |
override def iterator: Iterator[(K, V)] = | |
elems.iterator | |
override def mapFactory: MapFactory[MapCC] = MyMap | |
override def toString: String = s"MyMap(${elems.mkString(",")})" | |
} | |
object MyMap extends MapFactory[MyMap] { | |
override def from[K, V](it: IterableOnce[(K, V)]): MyMap[K, V] = newBuilder[K, V].addAll(it).result() | |
override def empty[K, V]: MyMap[K, V] = new MyMap(Map.empty) | |
override def newBuilder[K, V]: mutable.Builder[(K, V), MyMap[K, V]] = | |
new ListBuffer[(K, V)]().mapResult(elems => new MyMap(elems.toMap)) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.tiqwab.example.step4 | |
import scala.collection.mutable.ListBuffer | |
import scala.collection.{immutable, mutable, IterableFactory, StrictOptimizedSetOps} | |
class MySet[A] private (elems: Set[A]) | |
extends immutable.Set[A] with immutable.SetOps[A, MySet, MySet[A]] with StrictOptimizedSetOps[A, MySet, MySet[A]] { | |
// Should be implemented for immutable.Set | |
override def incl(elem: A): MySet[A] = new MySet(elems.incl(elem)) | |
override def excl(elem: A): MySet[A] = new MySet(elems.excl(elem)) | |
override def contains(elem: A): Boolean = elems.contains(elem) | |
override def iterator: Iterator[A] = elems.iterator | |
override def iterableFactory: IterableFactory[MySet] = MySet | |
override def toString: String = s"MySet(${elems.mkString(",")})" | |
} | |
object MySet extends IterableFactory[MySet] { | |
override def from[A](source: IterableOnce[A]): MySet[A] = newBuilder[A].addAll(source).result() | |
override def empty[A]: MySet[A] = new MySet(Set.empty) | |
override def newBuilder[A]: mutable.Builder[A, MySet[A]] = | |
new ListBuffer[A]().mapResult(elems => new MySet(elems.toSet)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment