diff options
author | Martin Odersky <odersky@gmail.com> | 2009-03-17 19:16:19 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2009-03-17 19:16:19 +0000 |
commit | 9a4199709d2c3c910dbbe17bffdac97df69b1d8f (patch) | |
tree | c5ec122bb4215657ab241d3958a2813e3ac0100a /test/files/pos/builders.scala | |
parent | 36bf7cb302fe3df9cb654567b9fc3443cb2cc5ff (diff) | |
download | scala-9a4199709d2c3c910dbbe17bffdac97df69b1d8f.tar.gz scala-9a4199709d2c3c910dbbe17bffdac97df69b1d8f.tar.bz2 scala-9a4199709d2c3c910dbbe17bffdac97df69b1d8f.zip |
chyanged implicits so that implicit Builder pat...
chyanged implicits so that implicit Builder pattern works.
Diffstat (limited to 'test/files/pos/builders.scala')
-rwxr-xr-x | test/files/pos/builders.scala | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/test/files/pos/builders.scala b/test/files/pos/builders.scala new file mode 100755 index 0000000000..0b620769c0 --- /dev/null +++ b/test/files/pos/builders.scala @@ -0,0 +1,66 @@ +object builders { + + trait Builder[-From, +To, -Elem] { + def += (elem: Elem) + def result: To + } + + implicit def iterableBuilder[A, B] = new Builder[Iterable[A], Iterable[B], B] { + println("new iterable builder") + private val buf = new scala.collection.mutable.ListBuffer[B] + def += (elem: B) { buf += elem } + def result: Iterable[B] = buf.toList + } + + implicit def listBuilder[A, B] = new Builder[List[A], List[B], B] { + println("new list builder") + private val buf = new scala.collection.mutable.ListBuffer[B] + def += (elem: B) { buf += elem } + def result: List[B] = buf.toList + } +/* + def fill[A, Dim1, Dim2, Coll](n1: Int, n2: Int, elem: A)(implicit b1: Builder[Coll, Dim1, A], b2: Builder[Coll, Dim2, Dim1]) = { + for (i <- 0 until n1) { + for (j <- 0 until n2) { + b1 += elem + } + b2 += b1.result + } + b2.result + } +*/ +/* + implicit def arrayBuilder[A, B] = new Builder[Array[A], Array[B], B] { + println("new arr ay builder") + private val buf = new scala.collection.mutable.ListBuffer[B] + def += (elem: B) { buf += elem } + def result: Array[B] = buf.toArray + } +*/ + class Iter[A, C](elems: List[A]) { + def ++ [B >: A, D](xs: Iterable[B])(implicit b: Builder[C, D, B]): D = { + for (x <- elems) b += x + for (x <- xs) b += x + b.result + } + def map[B, D](f: A => B)(implicit b: Builder[C, D, B]): D = { + for (x <- elems) b += f(x) + b.result + } + } + + def main(args : Array[String]) : Unit = { + val x1 = new Iter[Int, List[Int]](List(1, 2, 3)) +// val x2 = new Iter[Int, Array[Int]](List(1, 2, 3)) + val x3 = new Iter[Int, Iterable[Int]](List(1, 2, 3)) + val y1: List[Int] = x1.map (_ + 1) +// val y2: Array[Int] = x2.map (_ + 1) + val y3: Iterable[Int] = x3.map (_ + 1) + val z1: List[Int] = y1 +// val z2: Array[Int] = y2 + val z3: Iterable[Int] = y3 + println(z1) +// println(z2) + println(z3) + } +} |