/
IterateeTest.scala
58 lines (50 loc) · 1.67 KB
/
IterateeTest.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.typesafe.slick.testkit.tests
import org.junit.Assert._
import slick.util.iter._
import com.typesafe.slick.testkit.util.{JdbcTestDB, TestkitTest}
@deprecated("Testing deprecated iteratee API", "3.0")
class IterateeTest extends TestkitTest[JdbcTestDB] {
import tdb.profile.simple._
class A(tag: Tag) extends Table[(String, Int)](tag, "a") {
def s = column[String]("s", O.PrimaryKey, O.Length(254))
def i = column[Int]("i")
def * = (s, i)
}
lazy val as = TableQuery[A]
def test {
as.ddl.create
as.insertAll(("a", 1), ("b", 2), ("c", 3), ("d", 4))
val q1 = as.sortBy(_.s)
/* Sum i values until > 5 with foldLeft().
* There is no way to stop early when the limit has been reached */
var seen1 = ""
val r1 = q1.foldLeft(0) { case (z, (s, i)) =>
seen1 += s
if(z > 5) z else z + i
}
assertEquals(6, r1)
assertEquals("abcd", seen1)
/* Do the same with enumerate() and terminate when done */
var seen2 = ""
def step(z: Int): Input[(String, Int)] => IterV[(String, Int), Int] = {
case El((s, i)) =>
seen2 += s
if(z+i > 5) Done(z+i, Empty) else Cont(step(z+i))
case Empty =>
seen2 += "_"
Cont(step(z))
case EOF =>
seen2 += "."
Done(z, EOF)
}
val r2 = q1.enumerate(Cont(step(0))).run
assertEquals(6, r2)
assertEquals("abc", seen2)
/* Using a fold on the Input and some syntactic sugar */
def step2(z: Int): Cont.K[(String, Int), Int] = _.fold({ case (s, i) =>
if(z+i > 5) Done(z+i) else Cont(step2(z+i))
}, Cont(step2(z)), Done(z, EOF))
val r3 = q1.enumerate(Cont(step2(0))).run
assertEquals(6, r3)
}
}