Advertisement
Guest User

Untitled

a guest
Jul 4th, 2015
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.15 KB | None | 0 0
  1. import shapeless._
  2.  
  3. object Values {
  4. implicit def conv[T](self: this.type)(implicit v: MkValues[T]): Set[T] = Values[T]
  5.  
  6. def apply[T](implicit v: MkValues[T]): Set[T] = v.values.toSet
  7.  
  8. trait MkValues[T] {
  9. def values: List[T]
  10. }
  11.  
  12. object MkValues {
  13. implicit def values[T, Repr <: Coproduct]
  14. (implicit
  15. gen: Generic.Aux[T, Repr],
  16. v: Aux[T, Repr]
  17. ): MkValues[T] =
  18. new MkValues[T] {
  19. def values = v.values
  20. }
  21.  
  22. trait Aux[T, Repr] {
  23. def values: List[T]
  24. }
  25.  
  26. object Aux {
  27. implicit def cnilAux[A]: Aux[A, CNil] =
  28. new Aux[A, CNil] {
  29. def values = Nil
  30. }
  31.  
  32. implicit def cconsAux[T, L <: T, R <: Coproduct]
  33. (implicit
  34. vl: Witness.Aux[L],
  35. vr: Aux[T, R]
  36. ): Aux[T, L :+: R] =
  37. new Aux[T, L :+: R] {
  38. def values = vl.value :: vr.values
  39. }
  40. }
  41. }
  42. }
  43.  
  44. sealed trait Sealed
  45. object Sealed {
  46. case object A extends Sealed
  47. case object B extends Sealed
  48. case object C extends Sealed
  49.  
  50. val values: Set[Sealed] = Values
  51. }
  52.  
  53. object EnumTest extends App {
  54. import Sealed.{ A, B, C }
  55. assert(Sealed.values == Set(A, B, C))
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement