|
| 1 | +// A strawman collection design study in a nutshell |
| 2 | +import reflect.ClassTag |
| 3 | +import Predef.??? |
| 4 | + |
| 5 | +class It[+A] extends Ops[A, It, It[A]] |
| 6 | + |
| 7 | +trait Ops[+A, +CC[_], +C] extends Any { |
| 8 | + def filter(f: A => Boolean): C = ??? |
| 9 | + def map[B](f: A => B): CC[B] = ??? |
| 10 | + def toSeq: It[A] = ??? |
| 11 | +} |
| 12 | + |
| 13 | +class ArraySeq[A] extends It[A] with Ops[A, ArraySeq, ArraySeq[A]] |
| 14 | + |
| 15 | + |
| 16 | +class LP { |
| 17 | + implicit def arrayToSeq[A](xs: Array[A]): ArraySeq[A] = ??? |
| 18 | +} |
| 19 | +object Test extends LP { |
| 20 | + |
| 21 | + implicit class ArrOps[A](val xs: Array[A]) extends AnyVal with Ops[A, ArraySeq, Array[A]] { |
| 22 | + def map[B: ClassTag](f: A => B): Array[B] = ??? |
| 23 | + override def toSeq: ArraySeq[A] = arrayToSeq(xs) |
| 24 | + } |
| 25 | + |
| 26 | + val xs1 = Array(1, 2, 3) |
| 27 | + val xs2 = xs1.filter(_ % 2 == 0) |
| 28 | + val xs2a: Array[Int] = xs2 |
| 29 | + val xs3 = xs1.map(_ + "!") |
| 30 | + val xs3a: Array[String] = xs3 |
| 31 | + |
| 32 | + def f[T](f: Int => T) = { |
| 33 | + val xs1 = Array(1, 2, 3) |
| 34 | + val xs2 = xs1.filter(_ % 2 == 0) |
| 35 | + val xs2a: Array[Int] = xs2 |
| 36 | + val xs3 = xs1.toSeq.map(f) |
| 37 | + val xs3a: ArraySeq[T] = xs3 |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | + |
| 42 | + |
| 43 | + |
| 44 | + |
0 commit comments