Skip to content

Instantly share code, notes, and snippets.

@jeovazero
Created September 15, 2023 03:11
Show Gist options
  • Save jeovazero/ad7cbaf444237331b47cd08f7f0e529a to your computer and use it in GitHub Desktop.
Save jeovazero/ad7cbaf444237331b47cd08f7f0e529a to your computer and use it in GitHub Desktop.
import FindByAgeCmd.*
type Age = Int
case class Person(name: String, age: Age)
val people = List(
Person("alice", 65),
Person("bob", 25),
Person("chien", 15),
Person("daniel", 35),
Person("elisa", 45)
)
enum FindByAgeCmd:
case EqualTo(value: Age)
case GreaterThan(value: Age)
case LessThan(value: Age)
case OrCond(a: FindByAgeCmd, b: FindByAgeCmd)
case AndCond(a: FindByAgeCmd, b: FindByAgeCmd)
def filterByAge(cmd: FindByAgeCmd, person: Person): Boolean = {
cmd match {
case EqualTo(value) => person.age == value
case GreaterThan(value) => person.age > value
case LessThan(value) => person.age < value
case OrCond(cmdA, cmdB) => filterByAge(cmdA, person) || filterByAge(cmdB, person)
case AndCond(cmdA, cmdB) => filterByAge(cmdA, person) && filterByAge(cmdB, person)
}
}
def show(cmd: FindByAgeCmd): String = {
cmd match {
case EqualTo(value) => s"Igual a $value"
case GreaterThan(value) => s"Maior que $value"
case LessThan(value) => s"Menor que $value"
case OrCond(cmdA, cmdB) => s"(${show(cmdA)}) OU (${show(cmdB)})"
case AndCond(cmdA, cmdB) => s"(${show(cmdA)}) E (${show(cmdB)})"
}
}
/*
-- Busque todas as pessoas com idades
-- - q1. maior que 30 -> GreaterThan 30
-- - q2. igual a 25 -> EqualTo 25
-- - q3. menor ou igual a 45 -> OrCond (LessThan 45) (EqualTo 45)
-- - q4. maior que 20 e menor que 60 -> AndCond (GreaterThan 20) (LessThan 60)
*/
def query(cmd: FindByAgeCmd) = {
val result = people.filter(p => filterByAge(cmd, p))
println(s"${show(cmd)}: $result")
}
query(GreaterThan(30))
query(EqualTo(25))
query(OrCond(LessThan(45), EqualTo(45)))
query(AndCond(GreaterThan(20), LessThan(60)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment