diff options
author | Jon Pretty <jon.pretty@propensive.com> | 2017-11-07 00:54:13 +0000 |
---|---|---|
committer | Jon Pretty <jon.pretty@propensive.com> | 2017-11-07 00:54:13 +0000 |
commit | 1f49e614b1a2e363adbbea6ec510f094e195ace8 (patch) | |
tree | 809eaeee6468610be46e6aa454d72e33ebbb446d /examples/src/main/scala/eq.scala | |
parent | a42cceae99ca8517ecff77fecdb23eba4d2c1036 (diff) | |
download | magnolia-1f49e614b1a2e363adbbea6ec510f094e195ace8.tar.gz magnolia-1f49e614b1a2e363adbbea6ec510f094e195ace8.tar.bz2 magnolia-1f49e614b1a2e363adbbea6ec510f094e195ace8.zip |
API improvements and better examples
Diffstat (limited to 'examples/src/main/scala/eq.scala')
-rw-r--r-- | examples/src/main/scala/eq.scala | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/examples/src/main/scala/eq.scala b/examples/src/main/scala/eq.scala new file mode 100644 index 0000000..ec9be14 --- /dev/null +++ b/examples/src/main/scala/eq.scala @@ -0,0 +1,25 @@ +package magnolia.examples + +import scala.language.higherKinds + +import magnolia._ +import scala.language.experimental.macros + +trait Eq[T] { def equal(value: T, value2: T): Boolean } + +object Eq { + type Typeclass[T] = Eq[T] + def join[T](ctx: JoinContext[Eq, T]): Eq[T] = new Eq[T] { + def equal(value1: T, value2: T) = + ctx.parameters.forall { param => param.typeclass.equal(param.dereference(value1), param.dereference(value2)) } + } + + def dispatch[T](ctx: DispatchContext[Eq, T]): Eq[T] = new Eq[T] { + def equal(value1: T, value2: T): Boolean = + ctx.dispatch(value1) { case sub => sub.typeclass.equal(sub.cast(value1), sub.cast(value2)) } + } + + implicit val string: Eq[String] = new Eq[String] { def equal(v1: String, v2: String) = v1 == v2 } + implicit val int: Eq[Int] = new Eq[Int] { def equal(v1: Int, v2: Int) = v1 == v2 } + implicit def generic[T]: Eq[T] = macro Magnolia.generic[T] +} |