diff options
-rw-r--r-- | .gitignore | 4 | ||||
-rw-r--r-- | build.sbt | 4 | ||||
-rw-r--r-- | examples/src/main/scala/cats.scala | 23 | ||||
-rw-r--r-- | examples/src/main/scala/example.scala | 10 | ||||
-rw-r--r-- | tests/shared/src/main/scala/magnolia/cats.scala | 17 | ||||
-rw-r--r-- | tests/shared/src/main/scala/magnolia/main.scala | 1 |
6 files changed, 59 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e7f1455 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +target +.jvm +.js +.native @@ -23,6 +23,7 @@ lazy val examples = crossProject(JSPlatform, JVMPlatform, NativePlatform) .settings(publishSettings: _*) .settings(moduleName := "magnolia-examples") .settings(quasiQuotesDependencies) + .settings(examplesDependencies) .nativeSettings(nativeSettings) .dependsOn(core) @@ -132,6 +133,9 @@ lazy val scalaMacroDependencies: Seq[Setting[_]] = Seq( libraryDependencies += compilerPlugin("org.scalamacros" % "paradise" % "2.1.0" cross CrossVersion.full) ) +lazy val examplesDependencies: Seq[Setting[_]] = Seq( + libraryDependencies += "org.typelevel" %% "cats-core" % "0.9.0") + credentials ++= (for { username <- Option(System.getenv().get("SONATYPE_USERNAME")) password <- Option(System.getenv().get("SONATYPE_PASSWORD")) diff --git a/examples/src/main/scala/cats.scala b/examples/src/main/scala/cats.scala new file mode 100644 index 0000000..08690c2 --- /dev/null +++ b/examples/src/main/scala/cats.scala @@ -0,0 +1,23 @@ +package magnolia.examples.cats + +import scala.collection.immutable.ListMap +import scala.language.experimental.macros +import scala.language.higherKinds + +import cats.Show +import magnolia.ContravariantDerivation +import magnolia.Macros + +object instances extends instances1 { + + implicit val showDerivation = new ContravariantDerivation[Show] { + type Return = String + def call[T](show: Show[T], value: T): String = show.show(value) + def construct[T](body: T => String): Show[T] = body(_) + def join(xs: ListMap[String, String]): String = xs.map { case (k, v) => s"$k=$v" }.mkString("{", ", ", "}") + } +} + +trait instances1 { + implicit def genericShow[T]: Show[T] = macro Macros.magnolia[T, Show[_]] +} diff --git a/examples/src/main/scala/example.scala b/examples/src/main/scala/example.scala index 543fa3d..6c289cb 100644 --- a/examples/src/main/scala/example.scala +++ b/examples/src/main/scala/example.scala @@ -6,6 +6,7 @@ import language.experimental.macros import language.higherKinds import collection.immutable.ListMap + object `package` { implicit class Showable[T: Show](t: T) { def show: String = implicitly[Show[T]].show(t) @@ -39,12 +40,21 @@ case class Country(name: String, code: String, salesTax: Boolean) trait Show[T] { def show(t: T): String } object Show extends Show_1 { implicit val showInt: Show[Int] = _.toString + implicit val showString: Show[String] = identity + implicit val showBool: Show[Boolean] = _.toString + implicit def showList[T: Show]: Show[List[T]] = xs => xs.map { x => s"list:${implicitly[Show[T]].show(x)}" }.mkString(";") + implicit def showSet[T: Show]: Show[Set[T]] = s => "set" + implicit val derivation = new ContravariantDerivation[Show] { type Return = String def call[T](show: Show[T], value: T): String = show.show(value) def construct[T](body: T => String): Show[T] = body(_) def join(xs: ListMap[String, String]): String = xs.map { case (k, v) => s"$k=$v" }.mkString("{", ", ", "}") } + + implicit class Showable[T: Show](t: T) { + def show: String = implicitly[Show[T]].show(t) + } } trait Show_1 { diff --git a/tests/shared/src/main/scala/magnolia/cats.scala b/tests/shared/src/main/scala/magnolia/cats.scala new file mode 100644 index 0000000..4a1c096 --- /dev/null +++ b/tests/shared/src/main/scala/magnolia/cats.scala @@ -0,0 +1,17 @@ +package magnolia + +import examples.{Address, Branch, Country, Entity, Leaf, Person} +import cats.instances.all._ +import cats.syntax.all._ +import examples.cats.instances._ +import language.experimental.macros + +object CatsMain { + + def main(args: Array[String]): Unit = { + println(Branch(Branch(Leaf(1, "a"), Leaf(2, "b")), Leaf(3, "c")).show) + println(List[Entity](Person("John Smith", + Address(List("1 High Street", "London", "SW1A 1AA"), + Country("UK", "GBR", false)))).show) + } +} diff --git a/tests/shared/src/main/scala/magnolia/main.scala b/tests/shared/src/main/scala/magnolia/main.scala index 3ac3fb6..4a9347a 100644 --- a/tests/shared/src/main/scala/magnolia/main.scala +++ b/tests/shared/src/main/scala/magnolia/main.scala @@ -1,6 +1,7 @@ package magnolia import examples._ +import examples.Show._ object Main { def main(args: Array[String]): Unit = { |