blob: c4836bb74588580b353cd429eb15544ef2267dc7 (
plain)
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
|
package reading.models
trait Filter {
def filter(book: Book): Boolean
def kind: FilterKind
def name: String
}
sealed trait FilterKind
case object ThemeKind extends FilterKind
case object GenreKind extends FilterKind
object Filter {
def apply[T](in: T)(implicit filterFactory: FilterFactory[T]): Filter =
filterFactory.create(in)
def contains(filters: Seq[Filter], filter: Filter): Boolean =
filters.find(f => f.kind == filter.kind && f.name == filter.name).nonEmpty
def equals(f1: Filter, f2: Filter): Boolean =
f1.kind == f2.kind && f1.name == f2.name
}
trait FilterFactory[T] {
def create(in: T): Filter
}
object FilterFactory {
implicit object ThemeFilter extends FilterFactory[Theme] {
def create(theme: Theme): Filter =
new Filter {
def filter(book: Book): Boolean = book.themes.contains(theme)
val kind: FilterKind = ThemeKind
val name: String = theme.toString()
}
}
implicit object GenreFilter extends FilterFactory[Genre] {
def create(genre: Genre): Filter =
new Filter {
def filter(book: Book): Boolean = book.genres.contains(genre)
val kind: FilterKind = GenreKind
val name: String = genre.toString()
}
}
}
|