Ok, thanks!

I could change my parser combinator to look like this:

trait DateParsers extends RegexParsers {
  def dateTime(pattern: String) = new Parser[LocalDate] {
    val dateFormat = DateTimeFormatters.pattern(pattern)

    def jodaParse(text: CharSequence, offset: Int) = {
      val parsePosition = new ParsePosition(offset)
      val result = dateFormat.parse(text, parsePosition)
      val date = () => result.toCalendricalMerger().getDate(false)
      (date, parsePosition)
    }

    def apply(in: Input) = {
      val source = in.source
      val offset = in.offset
      val start = handleWhiteSpace(source, offset)
      val (date, parsePosition) = jodaParse(source, start)
      if (parsePosition.getErrorIndex >= 0)
          Failure("Failed to parse date", in.drop(start - offset))
      else
          Success(date(), in.drop(parsePosition.getIndex - offset))
    }
  }
}

to get a LocalDate. I'll look into ThreeTen a bit more to see what
I'll use exactly, but anyways it seems to work - my enormous bulk of
tests from that old project passes :) :


class DateParserSpec extends FlatSpec with ShouldMatchers with DateParsers {
  "A DateParser" should "fail on weird output" in {
    val result = parseAll(dateTime("EEE MMM d HH:mm:ss"), "   xxx")
    result.successful should be(false)
  }
  it should "run fine on a matching date" in {
    val result = parseAll(dateTime("EEE MMM d HH:mm:ss yyyy Z"), "Wed
Aug 12 18:49:56 2009 +0200")
    result.successful should be(true)
  }
  it should "run fine on another matching date" in {
        val result = parseAll(dateTime("HH:ss:mm yyyy MMM"), "  22:56:23 2010 
Jan  ")
        result.successful should be (true)
  }
}


 I still really think that the call to toString() is a problem. Sure a
CharSequence is a random access datastructure but it is still very
usable from a streaming point of view as long as you don't look ahead
to much. This is exactly how the scala combinator parsers work. Look
at for instance PagedSeq:

http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/collection/immutable/PagedSeq$.html

This is a lazily evaluated sequence a that stores the elements in
pages of fixed length arrays. And I can do:

val input = PagedSeqReader(PagedSeq.fromFile(new
File("my/path/file.txt")) and use this lazy character stream straight
away in my combinator parser.

The toString method turns it to eager:

/** Convert sequence to string */
  override def toString = {
    val buf = new StringBuilder
    for (ch <- PagedSeq.this.iterator) buf append ch
    buf.toString
  }

which would make my date parsing-wrapper unusable from say a stream
over a network or a really large file.

I've looked at it again and to me it doesn't seem too hard to fix:
https://github.com/hedefalk/threeten/commit/517c1bcc6d7c4982f90a41781506d2616e9772f4
- tests pass.

But then again I might be biased since I think this one is very important ;)

The biggest issue is regionMatches i guess and I had to introduce a
Util-class again. If I were to issue a pull request, what would be
your preferred way of handling that one?

Thanks,
Viktor


On Mon, Jul 11, 2011 at 8:53 PM, Stephen Colebourne
<scolebou...@joda.org> wrote:
> On 11 July 2011 19:21, Viktor Hedefalk <hedef...@gmail.com> wrote:
>> I guess that the method that could be possible to use in ThreeTen
>> would be this one?
>>    public DateTimeParseContext parse(CharSequence text, ParsePosition
>> position) {
>
> If you need the ParsePosition, then that is the one.
>
>> This line hurts
>>
>>  // parse a String as its a better API for parser writers
>>  String str = text.toString();
>>
>> since it will be the entire input I'm parsing but I guess it probably
>> works in practice in my case, I'll have to try it out and get back.
>
> Thats the current choice I'm making, CharSequence outside, String inside.
>
>> Just of curiosity, what is it in String that makes it easier for parser 
>> writers?
>
> Its just a bigger API, with startsWith, contains, indexOf,
> regionMatches ... I tried to convert it to CharSeq internally, but it
> seemed like more hassle than it was worth. If you can convince me its
> really a major hassle or performance issue, then I might accept a pull
> request, but I'd prefer not to if possible.
>
> Stephen
>
> ------------------------------------------------------------------------------
> All of the data generated in your IT infrastructure is seriously valuable.
> Why? It contains a definitive record of application performance, security
> threats, fraudulent activity, and more. Splunk takes this data and makes
> sense of it. IT sense. And common sense.
> http://p.sf.net/sfu/splunk-d2d-c2
> _______________________________________________
> Joda-interest mailing list
> Joda-interest@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/joda-interest
>

------------------------------------------------------------------------------
All of the data generated in your IT infrastructure is seriously valuable.
Why? It contains a definitive record of application performance, security 
threats, fraudulent activity, and more. Splunk takes this data and makes 
sense of it. IT sense. And common sense.
http://p.sf.net/sfu/splunk-d2d-c2
_______________________________________________
Joda-interest mailing list
Joda-interest@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/joda-interest

Reply via email to