Advertisement
Guest User

Untitled

a guest
Mar 17th, 2015
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.28 KB | None | 0 0
  1. trait BrandsProvider{
  2.   val brands: Seq[String]
  3.   def addBrands(data: Seq[String]) = data ++ brands
  4. }
  5.  
  6. trait PageProvider{
  7.   val page: (Int, Int)
  8.   def addPage(data: Seq[String]) = data :+ page.toString
  9. }
  10.  
  11. trait Basic{
  12.   def req(data: Seq[String]) = data.mkString(" ")
  13. }
  14.  
  15. trait SimpleClient extends Basic{
  16.   def sReq(data: Seq[String]) = req(data)
  17. }
  18.  
  19. trait BrandsClient extends Basic{
  20.   self: BrandsProvider =>
  21.   def bReq(data: Seq[String]) = req(addBrands(data))
  22. }
  23.  
  24. trait PageClient extends Basic{
  25.   self: PageProvider =>
  26.   def pReq(data: Seq[String]) = req(addPage(data))
  27. }
  28.  
  29. trait PageBrandsClient extends Basic{
  30.   self: BrandsProvider with PageProvider =>
  31.   def pbReq(data: Seq[String]) = req(addPage(addBrands(data)))
  32. }
  33.  
  34. object X1{
  35.   def createClient(_brands: Seq[String], _page: (Int, Int)) = new {
  36.     val brands = _brands
  37.     val page = _page
  38.   } with SimpleClient with PageBrandsClient with PageClient with BrandsProvider with PageProvider
  39.  
  40.   def createClient(_brands: Seq[String]) = new {
  41.     val brands = _brands
  42.   } with SimpleClient with BrandsClient with BrandsProvider
  43.  
  44.   def createClient( _page: (Int, Int)) = new {
  45.     val page = _page
  46.   } with SimpleClient with PageClient with PageProvider
  47.  
  48.   def createClient() = new SimpleClient { }
  49. }
  50.  
  51. object X2{
  52.   trait BOOL
  53.   trait TRUE extends BOOL
  54.   trait FALSE extends BOOL
  55.  
  56.   class Builder[HasBrands <: BOOL, HasPage <: BOOL] private[X2] (val _brands: Option[Seq[String]], val _page: Option[(Int, Int)]){
  57.     def withBrands(brands: Seq[String]): Builder[TRUE, HasPage] = new Builder(Some(brands), _page)
  58.     def withPage(page: (Int, Int)): Builder[HasBrands, TRUE] = new Builder(_brands, Some(page))
  59.   }
  60.  
  61.   def createClient = new Builder(None, None)
  62.  
  63.   implicit def toSClient(builder: Builder[_, _]) = new SimpleClient { }
  64.  
  65.   implicit def toBClient(builder: Builder[TRUE, _]) = new {
  66.     val brands = builder._brands.get
  67.   } with BrandsClient with BrandsProvider
  68.  
  69.   implicit def toPClient(builder: Builder[_, TRUE]) = new {
  70.     val page = builder._page.get
  71.   } with PageClient with PageProvider
  72.  
  73.   implicit def toBPClient(builder: Builder[TRUE, TRUE]) = new {
  74.     val brands = builder._brands.get
  75.     val page = builder._page.get
  76.   } with PageBrandsClient with BrandsProvider with PageProvider
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement