diff options
author | Joris | 2016-11-27 18:38:58 +0100 |
---|---|---|
committer | Joris | 2016-12-20 23:05:43 +0100 |
commit | b780f6f660cc5b2ff2b1ca3884871002823256a1 (patch) | |
tree | c530166206743be1925688f8b3319c630208a695 /src/main/scala/reading/models/Filter.scala | |
parent | 0aab7be2cf2cf73c62b305450902cdc3fe77cd4a (diff) | |
download | reading-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.scala | 46 |
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() + } + } +} |