Skip to content

Instantly share code, notes, and snippets.

@pfcoperez
Last active December 10, 2018 15:24
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 pfcoperez/ff55cadb42e3f436e1348004876b23ae to your computer and use it in GitHub Desktop.
Save pfcoperez/ff55cadb42e3f436e1348004876b23ae to your computer and use it in GitHub Desktop.
case class Metadata[Meta, T](x: T, meta: Meta)
trait MetadataOps[T] {
def withMetadata[Meta](x: T, m: Meta): Metadata[Meta, T]
}
object syntax {
implicit def metadataAs[Meta, T](m: Metadata[Meta, T]): T = m.x
implicit class MetadataExt[T : MetadataOps](x: T) {
def withMetadata[Meta](m: Meta): Metadata[Meta, T] = implicitly[MetadataOps[T]].withMetadata(x, m)
}
}
implicit def evidences[T]: MetadataOps[T] = new MetadataOps[T] {
def withMetadata[Meta](x: T, m: Meta): Metadata[Meta, T] = Metadata[Meta, T](x, m)
}
case class AnEntity(name: String)
import syntax._
val a = AnEntity("hello")
val aWithMeta = a.withMetadata(System.currentTimeMillis)
println(aWithMeta.name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment