Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes #78 #79

Merged
merged 1 commit into from
Nov 27, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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) {
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When using 1 to 3 in Scala, I expect it give me Seq(1, 2, 3), which includes the last value.
Hence I would expect the to here will give me the last value, too.
Would it be better to use while (x <= underlying.getEnd) here?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You, are right. I have opened a separate issue for this: #83.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But intervals are more like start until end, instead of start to end.

For interval contains interval.end is false.

And this method will return a collection contains a point which is not in the original interval.
@pishen @wookietreiber

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
}
}

}