Skip to content

Instantly share code, notes, and snippets.

trait Set[A] {
def get(index: Long): A
def add(value: A): Set[A]
}
trait Perishable {
def expired: Boolean
}
case class Baguette() extends Perishable {
def expired: Boolean = ???
}
case class Croissant() extends Perishable {
def expired: Boolean = ???
trait DailyOrderService {
def needsReplacing(perishables: List[Perishable]): List[Perishable] = {
perishables.filter(_.expired)
}
}
trait PerishableLike[A] {
def expired: Boolean
}
case class PerishableLikeBaguette(b: Baguette) extends PerishableLike[Baguette] {
def expired: Boolean = ???
}
case class PerishableLikeCroissant(c: Croissant) extends PerishableLike[Croissant] {
def expired: Boolean = ???
def needsReplacing[T](perishables: List[PerishableLike[T]]): List[PerishableLike[T]] = {
perishables.filter(_.expired)
}
object Perishables {
implicit val baguettePerishable: Perishable[Baguette] = new Perishable[Baguette] {
def expired(b: Baguette): Boolean = false // hard coded, in reality we would examine `b` to figure out if it expired
}
implicit val croissantPerishable: Perishable[Croissant] = new Perishable[Croissant] {
def expired(c: Croissant): Boolean = false
}
}
scala> import Perishables._
import Perishables._
scala> DailyOrderService.needsReplacing(List(Baguette(), Baguette(), Baguette()))
res0: List[Baguette] = List()
object OutsourcedPerishables {
implicit val iceCreamPerishable: Perishable[IceCream] = new Perishable[IceCream] {
def expired(i: IceCream): Boolean = true // in reality you would actually calculate the expiration for ice cream
}
}