Advertisement
Guest User

Untitled

a guest
Dec 11th, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 1.91 KB | None | 0 0
  1. scala> :paste
  2. // Entering paste mode (ctrl-D to finish)
  3.  
  4. import shapeless.ops.traversable.FromTraversable
  5. import shapeless.syntax.std.traversable._
  6. import shapeless._
  7.  
  8. class TypeGenerator[T, N <: Nat] { type Result <: HList }
  9.  
  10. trait LowPriorityTypeGenerator {
  11.   implicit def hList[T, N <: Nat, L <: HList](implicit t: TypeGenerator[T, N]{ type Result = L }): TypeGenerator[T, Succ[N]]{ type Result = T :: L } =
  12.     new TypeGenerator[T, Succ[N]]{ type Result = T :: L }
  13. }
  14.  
  15. object TypeGenerator extends LowPriorityTypeGenerator {
  16.   implicit def hnil[T]: TypeGenerator[T, _0]{ type Result = HNil } = new TypeGenerator[T, _0]{ type Result = HNil }
  17. }
  18.  
  19.  
  20.  
  21. def toHList[T, TResult <: HList](l: List[T], n: Nat)(implicit tg: TypeGenerator[T, n.N]{ type Result = TResult }, fl: FromTraversable[TResult]): Option[TResult] = l.toHList[tg.Result]
  22.  
  23.  
  24. // Exiting paste mode, now interpreting.
  25.  
  26. import shapeless.ops.traversable.FromTraversable
  27. import shapeless.syntax.std.traversable._
  28. import shapeless._
  29. defined class TypeGenerator
  30. defined trait LowPriorityTypeGenerator
  31. defined object TypeGenerator
  32. toHList: [T, TResult <: shapeless.HList](l: List[T], n: shapeless.Nat)(implicit tg: TypeGenerator[T,n.N]{type Result = TResult}, implicit fl: shapeless.ops.traversable.FromTraversable[TResult])Option[TResult]
  33.  
  34. scala> val list = "a" :: "b" :: "c" :: Nil
  35. list: List[String] = List(a, b, c)
  36.  
  37. scala> toHList(list, Nat(3))
  38. res0: Option[this.Result] = Some(a :: b :: c :: HNil)
  39.  
  40. scala> toHList(list, 3)
  41. res1: Option[this.Result] = Some(a :: b :: c :: HNil)
  42.  
  43. scala> val hList = 1 :: "abc" :: 'd :: HNil
  44. hList: shapeless.::[Int,shapeless.::[String,shapeless.::[Symbol,shapeless.HNil]]] = 1 :: abc :: 'd :: HNil
  45.  
  46. scala> toHList("x" :: "y" :: "z" :: Nil, 3).map{ _ zip hList }
  47. res2: Option[shapeless.::[(String, Int),shapeless.::[(String, String),shapeless.::[(String, Symbol),shapeless.HNil]]]] = Some((x,1) :: (y,abc) :: (z,'d) :: HNil)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement