
resource.ManagedTraversable.scala Maven / Gradle / Ivy
The newest version!
// -----------------------------------------------------------------------------
//
// scala.arm - The Scala Incubator Project
// Copyright (c) 2009 The Scala Incubator Project. All rights reserved.
//
// The primary distribution site is http://jsuereth.github.com/scala-arm
//
// This software is released under the terms of the Revised BSD License.
// There is NO WARRANTY. See the file LICENSE for the full text.
//
// -----------------------------------------------------------------------------
package resource
import _root_.scala.collection.Traversable
import scala.util.continuations._
/**
* This trait provides a means to ensure traversable access to items inside a resource, while ensuring that the
* resource is opened/closed appropriately before/after the traversal. This class can be dangerous because it
* always tries to open and close the resource for every call to foreach. This is practically ever method
* call on a Traversable besides the "view" method.
*/
trait ManagedTraversable[+B, A] extends Traversable[B] {
/**
* The resource we plan to traverse through
*/
val resource : ManagedResource[A]
/**
* This method determines if the error can be ignored and traversable continues
*/
def ignoreError(error : Exception) : Boolean = false
/**
* This method is called if an exception happens during traversal of the collection. We allow subclasses to
* override this to change the default behavior of resource related errors on traversal.
*/
def handleErrorsDuringTraversal(ex : List[Throwable]) : Unit = {
ex.headOption.foreach(throw _)
}
/**
* This method gives us an iterator over items in a resource.
*/
protected def internalForeach[U](resource: A, f : B => U) : Unit
/**
* Executes a given function against all items in the resource. The resource is opened/closed during the call
* to this method.
*/
def foreach[U](f: B => U): Unit = {
val result = resource.acquireFor { r =>
try {
internalForeach(r, f)
} catch {
case e : Exception if ignoreError(e) => //Ignore...
}
}
//If there are errors -> Handle them appropriately
result.left.foreach(handleErrorsDuringTraversal)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy