Step by step:
Method \object JsPath
val path1: JsPath = JsPath \ "from_user_name"
val path2: JsPath = JsPath \ "text"
Method readfor an object of typeJsPath
val reads1: Reads[String] = path1.read[String]
val reads2: Reads[String] = path2.read[String]
Reads ~, FunctionalBuilderOps M[T] FunctionalBuilderOps[M[_], T] play.api.libs.functional.syntax - toFunctionalBuilderOps.
val reads1FunctionalBuilderOps: FunctionalBuilderOps[Reads, String] =
toFunctionalBuilderOps(reads1)
val canBuild2: CanBuild2[String, String] = reads1FunctionalBuilderOps.~(reads2)
Tweet.apply _ scala FunctionN N:
val func: (String, String) => Tweet = Tweet.apply _
CanBuild2[A, B] apply. (A, B) => C Reads[C] ( ):
implicit val tweetReads: Reads[Tweet] = canBuild2.apply(func)
JsPath#read, toFunctionalBuilderOps CanBuild2#apply. :
val reads1: Reads[String] = path1.read[String](Reads.StringReads)
...
val reads1FunctionalBuilderOps: FunctionalBuilderOps[Reads, String] =
toFunctionalBuilderOps(reads1)(
functionalCanBuildApplicative(
Reads.applicative(JsResult.applicativeJsResult)))
...
implicit val tweetReads: Reads[Tweet] =
canBuild2.apply(func)(functorReads)