blob: 269af826aecc7928a63838e8ada81098c9599af3 (
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
package reading.models
trait FilterFactory[T] {
def create(in: T): Filter
}
object FilterFactory {
implicit object PeriodFilter extends FilterFactory[Period] {
def create(period: Period): Filter =
new Filter {
def filter(book: Book): Boolean = book.period == Some(period)
val kind: FilterKind = FilterKind.Period
val nonFormattedName: String = period.toString()
val name: String = period.prettyPrint()
}
}
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 = FilterKind.Theme
val nonFormattedName: String = theme.toString()
val name: String = theme.prettyPrint()
}
}
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 = FilterKind.Genre
val nonFormattedName: String = genre.toString()
val name: String = genre.prettyPrint()
}
}
implicit object ProgramFilter extends FilterFactory[Program] {
def create(program: Program): Filter =
new Filter {
def filter(book: Book): Boolean = book.programs.contains(program)
val kind: FilterKind = FilterKind.Program
val nonFormattedName: String = program.toString()
val name: String = program.prettyPrint()
}
}
implicit object GradeFilter extends FilterFactory[Grade] {
def create(grade: Grade): Filter =
new Filter {
def filter(book: Book): Boolean = book.programs.map(Program.grade).contains(grade)
val kind: FilterKind = FilterKind.Grade
val nonFormattedName: String = grade.toString()
val name: String = grade.prettyPrint()
}
}
implicit object LevelFilter extends FilterFactory[Level] {
def create(level: Level): Filter =
new Filter {
def filter(book: Book): Boolean = book.level == level
val kind: FilterKind = FilterKind.Level
val nonFormattedName: String = level.toString()
val name: String = level.prettyPrint()
}
}
}
|