aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/models/Filter.scala
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()
      }
  }
}