Skip to content

Instantly share code, notes, and snippets.

@ruurtjan
Last active May 27, 2020 07:56
Show Gist options
  • Save ruurtjan/7df3ac944cdfbc668e090b24104b22b4 to your computer and use it in GitHub Desktop.
Save ruurtjan/7df3ac944cdfbc668e090b24104b22b4 to your computer and use it in GitHub Desktop.
functional-dsl-blog-10.scala
sealed trait EmailFilter { self =>
def &&(that: EmailFilter): EmailFilter = EmailFilter.And(self, that)
def ||(that: EmailFilter): EmailFilter = (self.negate && that.negate).negate
def negate : EmailFilter = EmailFilter.Not(self)
import EmailFilter._
def run(email: Email): Boolean = self match {
case Always => true
case Not(filter: EmailFilter) => !filter.run(email)
case And(left: EmailFilter, right: EmailFilter) =>
left.run(email) && right.run(email)
// This uses Scala's Boolean.&&, not the EmailFilter.&& defined in line 2
}
}
object EmailFilter {
final case object Always extends EmailFilter
final case class Not(filter: EmailFilter) extends EmailFilter
final case class And(left: EmailFilter, right: EmailFilter) extends EmailFilter
val always: EmailFilter = Always
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment