aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2018-06-06 21:27:28 +0100
committerJon Pretty <jon.pretty@propensive.com>2018-06-06 21:27:28 +0100
commit091788d0ad6f94c91cc20d6074c3403934702325 (patch)
tree11416ba645230b6a7a5ef50a982dd3d07e97cc40 /examples
parenta59b1e72c9ad076034bde13be1e0f90452b45f20 (diff)
downloadmagnolia-091788d0ad6f94c91cc20d6074c3403934702325.tar.gz
magnolia-091788d0ad6f94c91cc20d6074c3403934702325.tar.bz2
magnolia-091788d0ad6f94c91cc20d6074c3403934702325.zip
Permit derivations of products when `dispatch` not defined
Diffstat (limited to 'examples')
-rw-r--r--examples/shared/src/main/scala/hash.scala37
1 files changed, 37 insertions, 0 deletions
diff --git a/examples/shared/src/main/scala/hash.scala b/examples/shared/src/main/scala/hash.scala
new file mode 100644
index 0000000..2c284c5
--- /dev/null
+++ b/examples/shared/src/main/scala/hash.scala
@@ -0,0 +1,37 @@
+/* Magnolia, version 0.7.1. Copyright 2018 Jon Pretty, Propensive Ltd.
+ *
+ * The primary distribution site is: http://co.ntextu.al/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+ * either express or implied. See the License for the specific language governing permissions
+ * and limitations under the License.
+ */
+package magnolia.examples
+
+import magnolia._
+import scala.language.experimental.macros
+
+trait WeakHash[T] { def hash(value: T): Int }
+
+object WeakHash {
+
+ type Typeclass[T] = WeakHash[T]
+
+ def combine[T](ctx: CaseClass[WeakHash, T]): WeakHash[T] = new WeakHash[T] {
+ def hash(value: T): Int = ctx.parameters.map { param =>
+ param.typeclass.hash(param.dereference(value))
+ }.foldLeft(0)(_ ^ _)
+ }
+
+ implicit val string: WeakHash[String] = _.map(_.toInt).sum
+ implicit val int: WeakHash[Int] = identity
+ implicit val double: WeakHash[Double] = _.toInt
+
+ implicit def gen[T]: WeakHash[T] = macro Magnolia.gen[T]
+}