aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorJon Pretty <jon.pretty@propensive.com>2017-11-04 20:11:53 +0100
committerJon Pretty <jon.pretty@propensive.com>2017-11-04 20:11:53 +0100
commitfdd207e848e24fd6fb449a93e024f0405eab3299 (patch)
treeab4f419791f277d43ec834ff2f12bdcbfb42e67b /examples
parent4d957fd5a35f1d7eed8643b22132b65696c80c8a (diff)
downloadmagnolia-fdd207e848e24fd6fb449a93e024f0405eab3299.tar.gz
magnolia-fdd207e848e24fd6fb449a93e024f0405eab3299.tar.bz2
magnolia-fdd207e848e24fd6fb449a93e024f0405eab3299.zip
Start of performance-enhancing refactoring
Diffstat (limited to 'examples')
-rw-r--r--examples/src/main/scala/typeclasses.scala24
1 files changed, 15 insertions, 9 deletions
diff --git a/examples/src/main/scala/typeclasses.scala b/examples/src/main/scala/typeclasses.scala
index b4af6d0..c79a6d7 100644
--- a/examples/src/main/scala/typeclasses.scala
+++ b/examples/src/main/scala/typeclasses.scala
@@ -13,9 +13,11 @@ import scala.annotation.unchecked.uncheckedVariance
object Show {
type Typeclass[T] = Show[String, T]
- def join[T](context: JoinContext[Typeclass, T])(value: T): String = context.parameters.map { param =>
- s"${param.label}=${param.typeclass.show(param.dereference(value))}"
- }.mkString(s"${context.typeName.split("\\.").last}(", ",", ")")
+ def join[T](context: JoinContext[Typeclass, T]): Show[String, T] = new Show[String, T] {
+ def show(value: T) = context.parameters.map { param =>
+ s"${param.label}=${param.typeclass.show(param.dereference(value))}"
+ }.mkString(s"${context.typeName.split("\\.").last}(", ",", ")")
+ }
def split[T](subclasses: List[Subclass[Typeclass, T]])(value: T): String =
subclasses.map { sub => sub.cast.andThen { value =>
@@ -31,13 +33,17 @@ trait Show[Out, T] { def show(value: T): Out }
object Eq {
type Typeclass[T] = Eq[T]
- def join[T](context: JoinContext[Eq, T])(value1: T, value2: T): Boolean =
- context.parameters.forall { param => param.typeclass.equal(param.dereference(value1), param.dereference(value2)) }
+ def join[T](context: JoinContext[Eq, T]): Eq[T] = new Eq[T] {
+ def equal(value1: T, value2: T) =
+ context.parameters.forall { param => param.typeclass.equal(param.dereference(value1), param.dereference(value2)) }
+ }
- def split[T](subclasses: List[Subclass[Eq, T]])(value1: T, value2: T): Boolean =
- subclasses.map { case subclass =>
- subclass.cast.andThen { value => subclass.typeclass.equal(subclass.cast(value1), subclass.cast(value2)) }
- }.reduce(_ orElse _)(value1)
+ def split[T](subclasses: List[Subclass[Eq, T]]): Eq[T] = new Eq[T] {
+ def equal(value1: T, value2: T) =
+ subclasses.map { case subclass =>
+ subclass.cast.andThen { value => subclass.typeclass.equal(subclass.cast(value1), subclass.cast(value2)) }
+ }.reduce(_ orElse _)(value1)
+ }
implicit val string: Eq[String] = _ == _
implicit val int: Eq[Int] = _ == _