Skip to content

Commit

Permalink
Merge pull request #79 from wookietreiber/wip-interval-to-collection
Browse files Browse the repository at this point in the history
fixes #78
  • Loading branch information
xuwei-k committed Nov 27, 2014
2 parents 2d295ea + 461881f commit a1a6746
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/main/scala/com/github/nscala_time/time/Implicits.scala
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ trait JodaImplicits {
implicit def richDateTimeZone(zone: DateTimeZone): RichDateTimeZone = new RichDateTimeZone(zone)
implicit def richDuration(dur: Duration): RichDuration = new RichDuration(dur)
implicit def richInstant(in: Instant): RichInstant = new RichInstant(in)
implicit def richInterval(in: Interval): RichInterval = new RichInterval(in)
implicit def richLocalDate(ld: LocalDate): RichLocalDate = new RichLocalDate(ld)
implicit def richLocalDateProperty(pty: LocalDate.Property): RichLocalDateProperty = new RichLocalDateProperty(pty)
implicit def richLocalDateTime(dt: LocalDateTime): RichLocalDateTime = new RichLocalDateTime(dt)
Expand Down
39 changes: 39 additions & 0 deletions src/main/scala/com/github/nscala_time/time/RichInterval.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.github.nscala_time.time

import JodaImplicits._
import com.github.nscala_time.PimpedType
import org.joda.time._
import scala.collection.generic.CanBuildFrom

class RichInterval(val underlying: Interval) extends Super with PimpedType[Interval] {

/** Returns a collection containing every instance between the interval, `period` time apart.
*
* {{{
* scala> val start = DateTime.now
* start: org.joda.time.DateTime = 2014-11-27T00:24:54.714+01:00
*
* scala> val end = start + 1.day
* end: org.joda.time.DateTime = 2014-11-28T00:24:54.714+01:00
*
* scala> start to end by 1.minute
* res0: scala.collection.immutable.IndexedSeq[org.joda.time.DateTime] = Vector(2014-11-27T00:24:54.714+01:00, ...)
*
* scala> val coll: Iterator[DateTime] = start to end by 1.minute
* coll: Iterator[com.github.nscala_time.time.Imports.DateTime] = non-empty iterator
* }}}
*/
def by[CC[_]](period: ReadablePeriod)(implicit cbf: CanBuildFrom[Nothing, DateTime, CC[DateTime]]): CC[DateTime] = {
val builder = cbf()

var x = underlying.getStart

while (x < underlying.getEnd) {
builder += x
x += period
}

builder.result
}

}
20 changes: 20 additions & 0 deletions src/test/scala/RichIntervalSpec.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.github.nscala_time.time

import org.scalacheck._
import org.scalacheck.Prop._

object RichIntervalSpec extends Properties("RichInterval") with Imports {

property("by") = forAll(Gen.choose(1,1440)) { n =>
val start = DateTime.now
val end = start + 1.day

val coll = start to end by n.minute

coll forall { date =>
start <= date &&
date <= end
}
}

}

0 comments on commit a1a6746

Please sign in to comment.