Skip to content

Instantly share code, notes, and snippets.

@ruurtjan
ruurtjan / functional-dsl-blog-6.scala
Created May 22, 2020 09:11
functional-dsl-blog-6.scala
object MoreOrthogonal {
def flatMap[A, B](l: List[A], f: A => List[B]): List[B] =
MoreOrthogonal.flatten(MoreOrthogonal.map(l, f))
def flatten[A](l: List[List[A]]): List[A] = ???
def map[A, B](l: List[A], f: A => B): List[B] = ???
}
@ruurtjan
ruurtjan / functional-dsl-blog-7.scala
Created May 22, 2020 12:02
Initial encoded email filter example
object initial_encoded_email_filter {
final case class Address(emailAddress: String)
final case class Email(sender: Address, to: List[Address], subject: String, body: String)
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)
@ruurtjan
ruurtjan / functional-dsl-blog-8.scala
Created May 22, 2020 12:02
Final encoded email filter
object final_encoded_email_filter {
final case class Address(emailAddress: String)
final case class Email(sender: Address, to: List[Address], subject: String, body: String)
case class EmailFilter(run: Email => Boolean) { self =>
def &&(that: EmailFilter): EmailFilter = EmailFilter(email => self.run(email) && that.run(email))
def ||(that: EmailFilter): EmailFilter = EmailFilter(email => self.run(email) || that.run(email))
def negate : EmailFilter = EmailFilter(email => !self.run(email))
@ruurtjan
ruurtjan / functional-dsl-blog-9.scala
Created May 22, 2020 12:08
functional-dsl-blog-9.scala
case class EmailFilter(run: Email => Boolean) { self =>
def &&(that: EmailFilter): EmailFilter =
EmailFilter(email => self.run(email) && that.run(email))
def ||(that: EmailFilter): EmailFilter =
EmailFilter(email => self.run(email) || that.run(email))
def negate : EmailFilter =
EmailFilter(email => !self.run(email))
}
object EmailFilter {
@ruurtjan
ruurtjan / functional-dsl-blog-10.scala
Last active May 27, 2020 07:56
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) =>