aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/reading/models/Filter.scala
diff options
context:
space:
mode:
authorJoris2016-11-27 18:38:58 +0100
committerJoris2016-12-20 23:05:43 +0100
commitb780f6f660cc5b2ff2b1ca3884871002823256a1 (patch)
treec530166206743be1925688f8b3319c630208a695 /src/main/scala/reading/models/Filter.scala
parent0aab7be2cf2cf73c62b305450902cdc3fe77cd4a (diff)
downloadreading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.gz
reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.tar.bz2
reading-b780f6f660cc5b2ff2b1ca3884871002823256a1.zip
Init
Diffstat (limited to 'src/main/scala/reading/models/Filter.scala')
-rw-r--r--src/main/scala/reading/models/Filter.scala46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/scala/reading/models/Filter.scala b/src/main/scala/reading/models/Filter.scala
new file mode 100644
index 0000000..c4836bb
--- /dev/null
+++ b/src/main/scala/reading/models/Filter.scala
@@ -0,0 +1,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()
+ }
+ }
+}