scala - Conditional method chaining based on Option -


recently found myself writing either db queries or simple seq method chains dynamic based on user input, instance:

def between(from: option[datetime], to: option[datetime]): seq[myobject] = {     db.all() // let's returns seq[myobject]       /* here want either restrict upper/lower bounds from/to if         exist or take values otherwise */ } 

if lazy i'd go with:

def between(from: option[datetime], to: option[datetime]): seq[myobject] = {     if(from.isempty && to.isempty) db.all()     else if(from.isempty) db.all().filter(_.date <= to.get)     else if(to.isempty) db.all().filter(_.date >= from.get)     else db.all().filter(_.date >= from.get && _.date <= to.get) } 

obviously filter example, have same problem instance take when want take n elements or based on option.

but if have more options passed? idiomatic way of doing in scala?

i can go pattern matching, that's not extremely different if/else?

i make several vals , from.map(...).getorelse() introduces temporary vals , again doesn't better if/else.

are there other tricks use?

i don't think design start with, because violates meaning of word between.

i have separate methods each case, clear semantics :

def between(from: datetime, datetime) def after(from: datetime) def before(to: datetime) def anytime() 

otherwise, if want keep way :

def between(from: option[date], to: option[date]) = {  val datepredicate = (test: (date,date) => boolean, date: option[date]) => (o: myobject) => date.map(test(o.date, _)).getorelse(true)  val frompredicate = datepredicate(_ >= _, from)  val topredicate = datepredicate(_ <= _, to)  db.all().filter(x => frompredicate(x) && topredicate(x)) } 

it more general , extendable, obscure.


Comments