Skip to content

Instantly share code, notes, and snippets.

@vil1
Created August 25, 2015 12:46
Show Gist options
  • Save vil1/332d3c959aff8e93c0e4 to your computer and use it in GitHub Desktop.
Save vil1/332d3c959aff8e93c0e4 to your computer and use it in GitHub Desktop.

Revisions

  1. vil1 created this gist Aug 25, 2015.
    43 changes: 43 additions & 0 deletions definition.scala
    Original 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]()

    }
    }
    21 changes: 21 additions & 0 deletions demo.scala
    Original 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)
    }*/

    }