Skip to content

Instantly share code, notes, and snippets.

@Centaur
Created July 18, 2013 10:26
Show Gist options
  • Save Centaur/6028302 to your computer and use it in GitHub Desktop.
Save Centaur/6028302 to your computer and use it in GitHub Desktop.
for 饼干
trait CanContain[T <: CanContain[T]]{
def contains(v: T):Boolean
}
trait Searchable[T <: CanContain[T]]{
val data: T
def contains(v: T):Boolean = this.data.contains(v)
}
case class Image(bytes: Array[Int]) extends CanContain[Image]{
def contains(v: Image) = {
this.bytes.containsSlice(v.bytes)
}
}
class Book[T <: CanContain[T]](val title: Searchable[T],
val content: Searchable[T],
val price: Double) {
def searchByTitle(v: T) = title.contains(v)
def searchByContent(v: T) = content.contains(v)
}
object Book extends App {
case class CartoonContent(data: Image) extends Searchable[Image]
case class CartoonTitle(data: Image) extends Searchable[Image]
case class Content(data: SearchString) extends Searchable[SearchString]
case class Title(data: SearchString) extends Searchable[SearchString]
implicit class SearchString(val str:String) extends CanContain[SearchString] {
def contains(v: SearchString) = {
this.str.contains(v.str)
}
}
implicit def string2Content(str: String) = new Content(str)
implicit def string2Title(str: String) = new Title(str)
implicit def array2Image(arr: Array[Int]) = new Image(arr)
val books = List(
new Book[SearchString](Title("A"), Content("scala"), 1.1),
new Book[SearchString](Title("B"), Content("java"), 2.0))
books.filter(_.searchByContent("a")).foreach(println)
val cartoons = List(
new Book[Image](CartoonTitle(Array(1, 2, 3)), CartoonContent(Array(4, 5, 6)), 1.1),
new Book[Image](CartoonTitle(Array(1, 2, 3)), CartoonContent(Array(4, 5, 6)), 2.0))
cartoons.filter(_.searchByContent(Array(1, 2))).foreach(println)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment