Skip to content

Instantly share code, notes, and snippets.

@piotrga
Created January 30, 2012 15:50
Show Gist options
  • Save piotrga/1705083 to your computer and use it in GitHub Desktop.
Save piotrga/1705083 to your computer and use it in GitHub Desktop.
Managed
import io.Source
import java.io.FileWriter
object ManagedDemo extends App{
import Managed._
import Managed.{managed => ®}
for (
fw <- ®(new FileWriter("target/test-out.txt"));
fr <- ®(Source.fromFile("build.sbt"))
){
fw.write(fr.mkString)
}
println("written:\n"+ ®(Source.fromFile("target/test-out.txt")).map(_.mkString))
}
trait Managed{
def close() : Unit
}
object Managed{
implicit def close2Managed[A <: { def close() : Any }](c:A) : Managed = Managed( c.close() )
implicit def dispose2Managed[A <: { def dispose() : Any }](c:A) : Managed = Managed( c.dispose() )
private def apply(closeResource : => Unit) : Managed = new Managed {
def close() : Unit = closeResource
}
def managed[A <% Managed](res: => A) = new Traversable[A]{
def foreach[U](f: (A) => U) {
val closable : A = res
try{
f(closable)
}finally{
closable.close()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment