Created
August 25, 2015 12:46
-
-
Save vil1/332d3c959aff8e93c0e4 to your computer and use it in GitHub Desktop.
Revisions
-
vil1 created this gist
Aug 25, 2015 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,43 @@ import shapeless._ object definition { case class Property[A](a: A) case class Embed[A](a: A) case class Hidden[A](a: A) def Prop[X] = Property[X] _ def Emb[X] = Embed[X] _ def Hid[X] = Hidden[X] _ trait Representation[A] { type Repr <: HList val repr: Repr } object Representation { type Aux[A, R] = Representation[A]{ type Repr = R } def apply[A, R <: HList](genA: Generic[A], r: R)(implicit typeAlignment: TypeAlignment[genA.Repr, R]): Aux[A, R] = new Representation[A] { type Repr = R val repr = r } } case class TypeAlignment[A, B]() object TypeAlignment { implicit def hnilTypeAlign2: TypeAlignment[HNil, HNil] = new TypeAlignment[HNil, HNil]() implicit def propertyRightAlign[A]: TypeAlignment[A, A => Property[A]] = new TypeAlignment[A, A => Property[A]]() implicit def embedRightAlign[A]: TypeAlignment[A, A => Embed[A]] = new TypeAlignment[A, A => Embed[A]]() implicit def hiddenRightAlign[A]: TypeAlignment[A, A => Hidden[A]] = new TypeAlignment[A, A => Hidden[A]]() implicit def hlistTypeAlign[A, B, TA <: HList, TB <: HList](implicit headAlignment: TypeAlignment[A, B], tailAlignment: TypeAlignment[TA, TB]): TypeAlignment[A :: TA, B :: TB] = new TypeAlignment[A :: TA, B :: TB]() } } This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,21 @@ import shapeless._ object demo { import definition._ type ACL = String case class Address(city: String, street: String, zipcode: String) case class User(name: String, age: Option[Int], address: Address, acl : ACL) val userRepr = Prop[String] :: Prop[Option[Int]] :: Emb[Address] :: Hid[ACL] :: HNil val bogusRepr = Prop[String] :: Prop[Int] :: Emb[Address] :: Hid[ACL] :: HNil /*def makeUserRepr(implicit gen: Generic[User]) = { val genUser = Generic[User] Representation(genUser, userRepr) }*/ }