NLinker icon

Passing functions having implicit parameters

NLinker | PRO | 12/07/17 10:53:54 AM UTC | 0 ⭐ | 6893 👁️ | Never ⏰ | []
Scala |

1.93 KB

|

None

|

0 👍

/

0 👎

 
// The output is
// List(Apple(1:Semerenka), Apple(1:Gloster), Apple(1:Red Prince))
// List(Orange(1:Turkey), Orange(1:Egypt))
// List(Peach(1:Yes!), Peach(1:Sure!))
// List(Apple(2:Semerenka), Apple(2:Gloster), Apple(2:Red Prince))
// List(Orange(2:Turkey), Orange(2:Egypt))
// List(Peach(2:Yes!), Peach(2:Sure!))
 
trait Session {
  override def toString: String = this match {
    case ReadOnlySession ⇒ "1"
    case NormalSession ⇒ "2"
  }
}
object ReadOnlySession extends Session
object NormalSession extends Session
 
object Test {
  def main(args: Array[String]): Unit = {
    implicit val session: Session = ReadOnlySession
    val normSession = NormalSession
 
    val list1 = genericList1(Apple.findAll)
    val list2 = genericList2(Orange.findAll)
    val list3 = genericList3(Peach.findAll()(_))
    val list4 = genericList1(Apple.findAll()(normSession))
    val list5 = genericList2(() ⇒ Orange.findAll()(normSession))
    val list6 = genericList3(Peach.findAll()(_))(normSession)
 
    println(list1)
    println(list2)
    println(list3)
    println(list4)
    println(list5)
    println(list6)
  }
 
  def genericList1[A](method: ⇒ List[A]): List[A] = {
    method
  }
 
  def genericList2[A](method: () ⇒ List[A]): List[A] = {
    method()
  }
 
  def genericList3[A](method: Session ⇒ List[A])(implicit session: Session): List[A] = {
    method(session)
  }
 
  case class Apple(sort: String)
  object Apple {
    def findAll()(implicit s: Session): List[Apple] = {
      List(Apple(s"$s:Semerenka"), Apple(s"$s:Gloster"), Apple(s"$s:Red Prince"))
    }
  }
 
  case class Orange(country: String)
  object Orange {
    def findAll()(implicit s: Session): List[Orange] =
      List(Orange(s"$s:Turkey"), Orange(s"$s:Egypt"))
  }
 
  case class Peach(tasty: String)
  object Peach {
    def findAll()(implicit s: Session): List[Peach] =
      List(Peach(s"$s:Yes!"), Peach(s"$s:Sure!"))
  }
 
}

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎