Guest User

Untitled

a guest
Dec 11th, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.97 KB | None | 0 0
  1. package com.posterous.agilesteel
  2.  
  3. trait IDisposable {
  4. def dispose()
  5. }
  6.  
  7. object LoanPattern {
  8. implicit val byteDefault: Exception => Byte = e => 0
  9. implicit val shortDefault: Exception => Short = e => 0
  10. implicit val intDefault: Exception => Int = e => 0
  11. implicit val longDefault: Exception => Long = e => 0
  12. implicit val floatDefault: Exception => Float = e => 0f
  13. implicit val doubleDefault: Exception => Double = e => 0d
  14. implicit val booleanDefault: Exception => Boolean = e => false
  15. implicit val unitDefault: Exception => Unit = e => ()
  16. implicit val anyRefDefault: Exception => AnyRef = e => null
  17.  
  18. def using[SomethingDisposable <: IDisposable, ResultType](getResource: => SomethingDisposable)(operate: SomethingDisposable => ResultType)(implicit catchBlock: Exception => ResultType) = {
  19. var optionalResource: Option[SomethingDisposable] = null
  20. try {
  21. optionalResource = Some(getResource)
  22. val resource = optionalResource.get
  23. operate(resource)
  24. } catch {
  25. case e: Exception => catchBlock(e)
  26. } finally optionalResource match {
  27. case Some(resource) => resource.dispose()
  28. case None =>
  29. }
  30. }
  31.  
  32. def using[SomethingDisposable <% IDisposable, ResultType](getResource: => SomethingDisposable)(operate: SomethingDisposable => ResultType)(catchBlock: Exception => ResultType) = {
  33. var optionalResource: Option[SomethingDisposable] = null
  34. try {
  35. optionalResource = Some(getResource)
  36. val resource = optionalResource.get
  37. operate(resource)
  38. } catch {
  39. case e: Exception => catchBlock(e)
  40. } finally optionalResource match {
  41. case Some(resource) => resource.dispose()
  42. case None =>
  43. }
  44. }
  45. }
  46.  
  47. class SomeResource extends IDisposable {
  48. def dispose() {}
  49. def doSomethingUseful() {}
  50. }
  51.  
  52. class AnotherResource {
  53. def close() {}
  54. def doSomeOtherThing() {}
  55. }
  56.  
  57. object ResouceToIDisposable {
  58. implicit def resourceToIDisposable(a: AnotherResource) = new IDisposable {
  59. def dispose() = a.close()
  60. }
  61. }
  62.  
  63. object LoanPatternDemonstration {
  64.  
  65. import LoanPattern._
  66. import ResouceToIDisposable._
  67.  
  68. def main(args: Array[String]) {
  69.  
  70. using(new SomeResource) {
  71. _.doSomethingUseful()
  72. }
  73.  
  74. using(new SomeResource) {
  75. _.doSomethingUseful()
  76. } { e => println(e.getMessage) }
  77.  
  78. using(new SomeResource) {
  79. _.doSomethingUseful()
  80. } {
  81. case r: RuntimeException => println("r " + r.getMessage)
  82. case e: Exception => println("e " + e.getMessage)
  83. }
  84.  
  85. using(new AnotherResource) {
  86. _.doSomeOtherThing()
  87. } { e => println(e.getMessage) }
  88.  
  89. using(new AnotherResource) {
  90. _.doSomeOtherThing()
  91. } {
  92. case r: RuntimeException => println("r " + r.getMessage)
  93. case e: Exception => println("e " + e.getMessage)
  94. }
  95.  
  96. // This one won't compile
  97. // And Scala gets confused when I try to overload using...
  98. using(new AnotherResource) {
  99. _.doSomeOtherThing()
  100. }
  101. }
  102. }
Add Comment
Please, Sign In to add comment