Guest User

Untitled

a guest
Jun 18th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.97 KB | None | 0 0
  1. object Controls {
  2.  
  3. type CloseableResource = { def close() }
  4.  
  5. /**
  6. * Equivalent of C# using keyword. Automatically closes any resource which has a close method.
  7. * Capable of returning a value
  8. * @param T resource which has a close() method
  9. * @param M result
  10. */
  11. def using[ T <: CloseableResource, M ](resource: T)(block: T => M ): M = {
  12. require( resource != null, "non-null resource is required" )
  13. try {
  14. block(resource)
  15. } finally {
  16. closeResource(resource)
  17. }
  18. }
  19.  
  20.  
  21. /**
  22. * Multiple resource version
  23. */
  24. def using[T <: CloseableResource, M](resources: T*)(block: Seq[T] => M): M = {
  25. try {
  26. block(resources)
  27. } finally {
  28. resources.foreach(closeResource)
  29. }
  30. }
  31.  
  32. /**
  33. * Mutes closing exceptions
  34. */
  35. private[this] def closeResource[ T <: CloseableResource ] ( resource: T ): Unit = {
  36. try {
  37. resource.close
  38. } catch {
  39. case e => e.printStackTrace
  40. }
  41. }
  42.  
  43. }
Add Comment
Please, Sign In to add comment