All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scales.aalto.parser.pull.iterv.AsyncParserIterV.scala Maven / Gradle / Ivy

The newest version!
package scales.aalto.parser.pull.iterv

import scales.xml._
import scales.utils._
import io._
import resources._
import com.fasterxml.aalto._
import AsyncXMLStreamReader.EVENT_INCOMPLETE
import javax.xml.stream.XMLStreamConstants.END_DOCUMENT

import java.nio.ByteBuffer
import java.nio.channels.ReadableByteChannel

import scales.xml.parser.pull.PullUtils
import scales.iterv.ResumableIter

import scalaz.{IterV, EphemeralStream, Input} 
import IterV._
import EphemeralStream.emptyEphemeralStream


import scales.xml.parser.strategies.{MemoryOptimisationStrategy, OptimisationToken}

import scales.aalto.parser.pull.AsyncParser


object AsyncParserIterV {

  /**
   * Provides a ResumableIter that converts DataChunks via a parser into a stream of PullTypes.  Returns Done when there are results from the pushed chunks.
   */
  def parse(parser: AsyncParser): ResumableIter[DataChunk, EphemeralStream[PullType]] = {

    def EOF: ResumableIter[DataChunk, EphemeralStream[PullType]] = {
      parser.closeResource

      //println("closing against EOF from parse")
      Done((emptyEphemeralStream, 
	  Cont(
	    error("Called the continuation on a closed parser")
	  )), IterV.EOF[DataChunk])
    }

    def emptyness : ResumableIter[DataChunk, EphemeralStream[PullType]] = Done((emptyEphemeralStream, Cont(step)), IterV.Empty[DataChunk])

    def step(s: Input[DataChunk]): ResumableIter[DataChunk, EphemeralStream[PullType]] = 
      s(el = e => {
	  //println("Did get a large chunk "+e)
	  val r = parser.nextInput(e)
	  r( el = es => {
		//println("got el with es " + es.isEmpty + " feeder " + parser.feeder.needMoreInput)
	      Done((es,
		    Cont(
		      step
		      )), IterV.Empty[DataChunk])
	      },
	      empty = {
		//println("empty from input")
		//emptyness
		Cont(step)
	      },
	      eof = EOF
	  )
	},
	empty = {
	  //println("empty input")
	  //emptyness
	  //Done((EphemeralStream.empty, Cont(step)), IterV.Empty[DataChunk]) // nothing that can be done on empty
	  Cont(step)
	},
	eof = EOF
      )

    Cont(step)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy