functional programming - Scala class wrapping a partially applied constructor - how to use it to create API methods? -


i'm trying create simple api dealing intervals of hours. (i'm aware of joda time, , i'm not trying reinvent it. rather exercise).

what achieve this:

(1)

assert(from("20:30").to("20:50") == interval("20:30", "20:50") ) //same thing, without implicit defs assert(from(time(20, 30)).to(time(20, 50)) == interval(time(20, 30), time(20, 50))) 


(2)

assert(from("20:30").forminutes(10) == from("20:30").to("20:40")) 


have managed implement (1), this: (ignoring tostring, ordered trait, a.s.o)

case class time(hour: int, minute: int)  case class interval(start: time, end: time)  object interval {    case class halfinterval(half: time => interval) {       def to(time: time): interval = half(time)       def forminutes(minutes: int): interval = ???      }    def from(start: time): halfinterval = halfinterval(interval(start, _)) }  object time {   def apply(hourminute: string): time = {     val tries = hourminute.split(":").map(s => try(s.toint))     tries match {       case array(success(hour), success(minute)) => time(hour, minute)       case _ => throw new illegalargumentexception     }   }   implicit def stringtotime(hourminute: string) = time(hourminute) } 


however, don't know how implement (2) (that is: interval.forminutes).

def forminutes(minutes: int): interval = {   val time = ?? // based on time object construct new time object here?   half(time) } 

can't seem wrap head around this.
"halfinterval" wrapper on time => interval make sense @ all?
designed empirically - from(..).to(..) calls work planned - rather functional-conceptual model in mind.
there better way achieve api?

thanks

this do:

object interval {    case class halfinterval(start: time) {       def to(end: time): interval = interval(start, end)       def forminutes(minutes: int): interval = to(getend(start, minutes))       private def getend(start: time, minutes: int) = ???      }    def from(start: time): halfinterval = halfinterval(start) } 

getend() adds minutes parameter start.minute, divided 60, adds result start.hours , rest of division minutes , there build end time. (then maybe hour modulus 24 in case go next day).

edit: halfinterval should value class, don't worry that.


Comments

Popular posts from this blog

ios - UICollectionView Self Sizing Cells with Auto Layout -

node.js - ldapjs - write after end error -

DOM Manipulation in Wordpress (and elsewhere) using php -