Skip to content

Instantly share code, notes, and snippets.

@fommil
Last active August 7, 2017 12:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fommil/d80d397819edbdd72a680c9ddceb2683 to your computer and use it in GitHub Desktop.
Save fommil/d80d397819edbdd72a680c9ddceb2683 to your computer and use it in GitHub Desktop.
package xmlformat
import scala.xml._
import export._
import shapeless._
import shapeless.labelled._
trait Encoder[A] {
def toXml(a: A): NodeSeq
}
object Encoder extends EncoderLowPriority
@imports[Encoder]
trait EncoderLowPriority {
implicit val EncoderString: Encoder[String] = new Encoder[String] {
override def toXml(a: String): NodeSeq = ???
}
implicit def EncoderOption[A: Encoder]: Encoder[Option[A]] =
new Encoder[Option[A]] {
override def toXml(a: Option[A]): NodeSeq = ???
}
}
trait DerivedEncoder[T] extends Encoder[T]
@exports object DerivedEncoder {
implicit def gen[T, Repr](
implicit
G: LabelledGeneric.Aux[T, Repr],
LER: Cached[Strict[DerivedEncoder[Repr]]]
): DerivedEncoder[T] = ???
implicit def hnil: DerivedEncoder[HNil] = ???
implicit def hcons[Key <: Symbol, Value, Remaining <: HList](
implicit Key: Witness.Aux[Key],
LEV: Lazy[Encoder[Value]],
LER: DerivedEncoder[Remaining]
): DerivedEncoder[FieldType[Key, Value] :: Remaining] = ???
implicit def cnil: DerivedEncoder[CNil] = null
implicit def ccons[Name <: Symbol, Instance, Remaining <: Coproduct](
implicit
Name: Witness.Aux[Name],
LEI: Lazy[Encoder[Instance]],
LER: DerivedEncoder[Remaining]
): DerivedEncoder[FieldType[Name, Instance] :+: Remaining] = ???
}
package examples {
sealed trait SimpleTrait
final case class Foo(s: String) extends SimpleTrait
final case class Bar() extends SimpleTrait
case object Baz extends SimpleTrait
final case class Faz(o: Option[String]) extends SimpleTrait
}
object Example {
import examples._
import DerivedEncoder.exports._
implicitly[Encoder[Foo]]
implicitly[Encoder[Option[String]]]
// implicitly[Encoder[SimpleTrait]]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment