Advertisement
mitrakov

Scala implicit composition

Aug 29th, 2018
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.80 KB | None | 0 0
  1. // Let's check implicit composition in Scala, e.g.:
  2. new BaseEmailChecker().withLengthMoreThan(10).withDomainCheck("gmail").withEnding(".com")
  3. // Question: how many times the base function will be executed?
  4.  
  5. trait Checker {
  6.   def execute(s: String): Boolean
  7. }
  8.  
  9. class BaseEmailChecker extends Checker {
  10.   override def execute(s: String): Boolean = {
  11.     println("CHECKING THE BASE FUNCTION!")
  12.     s.contains("@") && s.contains(".")
  13.   }
  14. }
  15.  
  16. object CheckerBuilder {
  17.   implicit class RichChecker(base: Checker) {
  18.     def withLengthMoreThan(n: Int) = new Checker {
  19.       override def execute(s: String): Boolean = {
  20.         println("CHECKING LENGTH!")
  21.         base.execute(s) && s.length > n
  22.       }
  23.     }
  24.  
  25.     def withDomainCheck(domain: String) = new Checker {
  26.       override def execute(s: String): Boolean = {
  27.         println("CHECKING DOMAIN!")
  28.         base.execute(s) && s.contains(domain) // regex would be better than just 'contains'
  29.       }
  30.     }
  31.  
  32.     def withEnding(ending: String) = new Checker {
  33.       override def execute(s: String): Boolean = {
  34.         println("CHECKING ENDING!")
  35.         base.execute(s) && s.endsWith(ending)
  36.       }
  37.     }
  38.   }
  39. }
  40.  
  41. import CheckerBuilder._
  42.  
  43. val checker1 = new BaseEmailChecker()
  44. val checker2 = new BaseEmailChecker().withLengthMoreThan(10).withDomainCheck("gmail").withEnding(".com")
  45.  
  46.  
  47.  
  48. // Come on!
  49. scala> checker1.execute("amitrakov@tala.co")
  50. CHECKING THE BASE FUNCTION!
  51. res0: Boolean = true
  52.  
  53. scala> checker2.execute("amitrakov@tala.co")
  54. CHECKING ENDING!
  55. CHECKING DOMAIN!
  56. CHECKING LENGTH!
  57. CHECKING THE BASE FUNCTION!
  58. res1: Boolean = false
  59.  
  60. scala> checker2.execute("amitrakov@gmail.com")
  61. CHECKING ENDING!
  62. CHECKING DOMAIN!
  63. CHECKING LENGTH!
  64. CHECKING THE BASE FUNCTION!
  65. res2: Boolean = true
  66.  
  67. // summary: the base function is executed only once!
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement