aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2017-06-22 18:30:59 +0100
committerGitHub <noreply@github.com>2017-06-22 18:30:59 +0100
commitf8ce6450c7dc1985db8ac29312bd76d3295257ab (patch)
treeba4aeb4336269ab565f555e7323e2be1231a5247 /examples
parentd3bf8bef81124ef47097d808a0b9299641fe5c7b (diff)
parent27a55611230b772eae1f0a37822decb43c21ac25 (diff)
downloadmagnolia-f8ce6450c7dc1985db8ac29312bd76d3295257ab.tar.gz
magnolia-f8ce6450c7dc1985db8ac29312bd76d3295257ab.tar.bz2
magnolia-f8ce6450c7dc1985db8ac29312bd76d3295257ab.zip
Merge branch 'master' into cats-contravariant-example
Diffstat (limited to 'examples')
-rw-r--r--examples/src/main/scala/example.scala43
1 files changed, 41 insertions, 2 deletions
diff --git a/examples/src/main/scala/example.scala b/examples/src/main/scala/example.scala
index c3d4c2f..6c289cb 100644
--- a/examples/src/main/scala/example.scala
+++ b/examples/src/main/scala/example.scala
@@ -6,11 +6,30 @@ import language.experimental.macros
import language.higherKinds
import collection.immutable.ListMap
-sealed trait EmptyType
+
+object `package` {
+ implicit class Showable[T: Show](t: T) {
+ def show: String = implicitly[Show[T]].show(t)
+ }
+ 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 class Equable[T: Eq](t: T) {
+ def isEqualTo(other: T): Boolean = implicitly[Eq[T]].isEqual(t, other)
+ }
+ implicit val eqString: Eq[String] = _ == _
+ implicit val eqBool: Eq[Boolean] = _ == _
+ implicit def eqList[T: Eq]: Eq[List[T]] =
+ (l1, l2) => l1.size == l2.size && (l1 zip l2).forall { case (e1, e2) => e1 isEqualTo e2 }
+ implicit def eqSet[T: Eq]: Eq[Set[T]] =
+ (s1, s2) => s1.size == s2.size && (s1 zip s2).forall { case (e1, e2) => e1 isEqualTo e2 }
+}
sealed trait Tree
case class Branch(left: Tree, right: Tree) extends Tree
-case class Leaf(value: Int, no: String) extends Tree
+case class Leaf(value: Int) extends Tree
sealed trait Entity
case class Person(name: String, address: Address) extends Entity
@@ -41,3 +60,23 @@ object Show extends Show_1 {
trait Show_1 {
implicit def generic[T]: Show[T] = macro Macros.magnolia[T, Show[_]]
}
+
+trait Eq[T] { def isEqual(a: T, b: T): Boolean }
+
+object Eq extends Eq_1 {
+
+ implicit val eqInt: Eq[Int] = _ == _
+
+ implicit val derivation = new ContravariantDerivation2[Eq] {
+ type Return = Boolean
+ def call[T](eq: Eq[T], value1: T, value2: T): Boolean =
+ if(value1.getClass == value2.getClass) eq.isEqual(value1, value2) else false
+ def construct[T](body: (T, T) => Boolean): Eq[T] = body(_, _)
+ def join(elements: ListMap[String, Boolean]): Boolean = elements.forall(_._2)
+ }
+}
+
+trait Eq_1 {
+ implicit def generic[T]: Eq[T] = macro Macros.magnolia[T, Eq[_]]
+}
+