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

me.jeffshaw.scalaz.stream.ProcessIoIteratorConstructors.scala Maven / Gradle / Ivy

The newest version!
package me.jeffshaw.scalaz.stream

import scalaz.concurrent.Task
import scalaz.stream._

object ProcessIoIteratorConstructors {
  /**
   * Create a Process from an iterator that requires some external or
   * other mutable resource, while ensuring that the resource is released.
   *
   * Use `iterators` if the resource is associated with multiple iterators.
   */
  def iterator[R, O](
    acquire: Task[R]
  )(createIterator: R => Task[Iterator[O]]
  )(release: R => Task[Unit]
  ): Process[Task, O] = {
    Process.await(acquire)(r => Process.await(createIterator(r))(IteratorConstructors.iteratorGo).onComplete(Process.eval_(release(r))))
  }

  /**
   * Create a Process from an external resource associated with multiple
   * iterators, while ensuring that the resource is released.
   *
   * Use `merge.mergeN` on the result to interleave the iterators, or
   * .flatMap(identity) to emit them in order.
   *
   * @param maxOpen Max number of open (running) processes at a time
   */
  def iterators[R, O](
    maxOpen: Int
  )(acquire: Task[R]
  )(createIterators: R => Task[Iterable[Iterator[O]]]
  )(release: R => Task[Unit]
  ): Process[Task, O] = {
    def createIteratorProcesses(r: R): Task[Iterable[Process[Task, O]]] = {
      for {
        iterators <- createIterators(r)
      } yield iterators.map(iterator => IteratorConstructors.iteratorGo(iterator))
    }
    Process.await(acquire) { r =>
      merge.mergeN(maxOpen)(Process.await(createIteratorProcesses(r)) { iterators =>
        Process.emitAll(iterators.toSeq)
      }).onComplete(Process.eval_(release(r)))
    }
  }

  /**
   * Create a Process from an external resource associated with multiple
   * iterators, while ensuring that the resource is released.
   *
   * Use `merge.mergeN` on the result to interleave the iterators, or
   * .flatMap(identity) to emit them in order.
   */
  def iterators[R, O](
    acquire: Task[R]
  )(createIterators: R => Task[Iterable[Iterator[O]]]
  )(release: R => Task[Unit]
  ): Process[Task, O] = {
    iterators[R, O](0)(acquire)(createIterators)(release)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy