aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore4
-rw-r--r--build.sbt4
-rw-r--r--examples/src/main/scala/cats.scala23
-rw-r--r--examples/src/main/scala/example.scala10
-rw-r--r--tests/shared/src/main/scala/magnolia/cats.scala17
-rw-r--r--tests/shared/src/main/scala/magnolia/main.scala1
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
diff --git a/build.sbt b/build.sbt
index db54f76..33026f3 100644
--- a/build.sbt
+++ b/build.sbt
@@ -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 = {