Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set up Machinist, use macros for Eq through Order syntax. #79

Merged
merged 4 commits into from
Feb 5, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 13 additions & 8 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ lazy val commonSettings = Seq(
"-language:existentials",
"-language:higherKinds",
"-language:implicitConversions",
"-language:experimental.macros",
"-unchecked",
"-Xfatal-warnings",
"-Xlint",
Expand Down Expand Up @@ -56,14 +57,18 @@ lazy val aggregate = project.in(file("."))
.settings(catsSettings: _*)
.settings(docSettings: _*)
.settings(noPublishSettings: _*)
.aggregate(core, laws, tests, data, std, examples)
.dependsOn(core, laws, tests, data, std, examples)
.aggregate(macros, core, laws, tests, data, std, examples)
.dependsOn(macros, core, laws, tests, data, std, examples)

lazy val core = project
lazy val macros = project
.settings(moduleName := "cats-macros")
.settings(catsSettings: _*)

lazy val core = project.dependsOn(macros)
.settings(moduleName := "cats")
.settings(catsSettings: _*)

lazy val laws = project.dependsOn(core, data)
lazy val laws = project.dependsOn(macros, core, data)
.settings(moduleName := "cats-laws")
.settings(catsSettings: _*)
.settings(
Expand All @@ -72,14 +77,14 @@ lazy val laws = project.dependsOn(core, data)
)
)

lazy val std = project.dependsOn(core, laws)
lazy val std = project.dependsOn(macros, core, laws)
.settings(moduleName := "cats-std")
.settings(catsSettings: _*)
.settings(
libraryDependencies += "org.spire-math" %% "algebra-std" % "0.2.0-SNAPSHOT" from "http://plastic-idolatry.com/jars/algebra-std_2.11-0.2.0-SNAPSHOT.jar"
)

lazy val tests = project.dependsOn(core, data, std, laws)
lazy val tests = project.dependsOn(macros, core, data, std, laws)
.settings(moduleName := "cats-tests")
.settings(catsSettings: _*)
.settings(noPublishSettings: _*)
Expand All @@ -89,11 +94,11 @@ lazy val tests = project.dependsOn(core, data, std, laws)
)
)

lazy val data = project.dependsOn(core)
lazy val data = project.dependsOn(macros, core)
.settings(moduleName := "cats-data")
.settings(catsSettings: _*)

lazy val examples = project.dependsOn(core)
lazy val examples = project.dependsOn(macros, core)
.settings(moduleName := "cats-examples")
.settings(catsSettings: _*)
.settings(noPublishSettings: _*)
Expand Down
4 changes: 2 additions & 2 deletions core/src/main/scala/cats/Foldable.scala
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ import simulacrum._
/**
* Apply f to each element of F and combine them using the Monoid[B].
*/
def foldMap[A, B: Monoid](fa: F[A])(f: A => B): B = foldLeft(fa, algebra.Monoid[B].empty) { (b, a) =>
algebra.Monoid[B].combine(b, f(a))
def foldMap[A, B: Monoid](fa: F[A])(f: A => B): B = foldLeft(fa, Monoid[B].empty) { (b, a) =>
Monoid[B].combine(b, f(a))
}

/**
Expand Down
4 changes: 0 additions & 4 deletions core/src/main/scala/cats/MonoidK.scala
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,3 @@ import simulacrum._
def combine(x: F[A], y: F[A]): F[A] = self.combine(x, y)
}
}

// object MonoidK {
// def apply[F[_]](implicit ev: MonoidK[F]): MonoidK[F] = ev
// }
4 changes: 0 additions & 4 deletions core/src/main/scala/cats/SemigroupK.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,3 @@ import simulacrum._
def combine(x: F[A], y: F[A]): F[A] = self.combine(x, y)
}
}

// object SemigroupK {
// def apply[F[_]](implicit ev: SemigroupK[F]): SemigroupK[F] = ev
// }
2 changes: 0 additions & 2 deletions core/src/main/scala/cats/arrow/Category.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package cats
package arrow

import algebra.Monoid

trait Category[F[_, _]] extends Compose[F] { self =>

def id[A]: F[A, A]
Expand Down
2 changes: 0 additions & 2 deletions core/src/main/scala/cats/arrow/Compose.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package cats
package arrow

import algebra.Semigroup

trait Compose[F[_, _]] { self =>
def compose[A, B, C](f: F[B, C], g: F[A, B]): F[A, C]

Expand Down
7 changes: 6 additions & 1 deletion core/src/main/scala/cats/package.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,12 @@ package object cats {
type Eq[A] = algebra.Eq[A]
type PartialOrder[A] = algebra.PartialOrder[A]
type Order[A] = algebra.Order[A]

type Semigroup[A] = algebra.Semigroup[A]
type Monoid[A] = algebra.Monoid[A]

val Eq = algebra.Eq
val PartialOrder = algebra.PartialOrder
val Order = algebra.Order
val Semigroup = algebra.Semigroup
val Monoid = algebra.Monoid
}
10 changes: 5 additions & 5 deletions core/src/main/scala/cats/syntax/eq.scala
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package cats
package syntax

import cats.macros.Ops

trait EqSyntax {
// TODO: use simulacrum instances eventually
implicit def eqSyntax[A: Eq](a: A) =
new EqOps[A](a)
implicit def eqSyntax[A: Eq](a: A) = new EqOps[A](a)
}

class EqOps[A](lhs: A)(implicit A: Eq[A]) {
def ===(rhs: A): Boolean = A.eqv(lhs, rhs)
def =!=(rhs: A): Boolean = A.neqv(lhs, rhs)
def ===(rhs: A): Boolean = macro Ops.binop[A, Boolean]
def =!=(rhs: A): Boolean = macro Ops.binop[A, Boolean]
}
12 changes: 6 additions & 6 deletions core/src/main/scala/cats/syntax/order.scala
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package cats
package syntax

import cats.macros.Ops

trait OrderSyntax {
// TODO: use simulacrum instances eventually
implicit def orderSyntax[A: Order](a: A) =
new OrderOps[A](a)
implicit def orderSyntax[A: Order](a: A) = new OrderOps[A](a)
}

class OrderOps[A](lhs: A)(implicit A: Order[A]) {
def compare(rhs: A): Int = A.compare(lhs, rhs)
def min(rhs: A): A = A.min(lhs, rhs)
def max(rhs: A): A = A.max(lhs, rhs)
def compare(rhs: A): Int = macro Ops.binop[A, Int]
def min(rhs: A): A = macro Ops.binop[A, A]
def max(rhs: A): A = macro Ops.binop[A, A]
}
22 changes: 11 additions & 11 deletions core/src/main/scala/cats/syntax/partialOrder.scala
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
package cats
package syntax

import cats.macros.Ops

trait PartialOrderSyntax {
// TODO: use simulacrum instances eventually
implicit def partialOrderSyntax[A: PartialOrder](a: A) =
new PartialOrderOps[A](a)
implicit def partialOrderSyntax[A: PartialOrder](a: A) = new PartialOrderOps[A](a)
}

class PartialOrderOps[A](lhs: A)(implicit A: PartialOrder[A]) {
def >(rhs: A): Boolean = A.gt(lhs, rhs)
def >=(rhs: A): Boolean = A.gteqv(lhs, rhs)
def <(rhs: A): Boolean = A.lt(lhs, rhs)
def <=(rhs: A): Boolean = A.lteqv(lhs, rhs)
def >(rhs: A): Boolean = macro Ops.binop[A, Boolean]
def >=(rhs: A): Boolean = macro Ops.binop[A, Boolean]
def <(rhs: A): Boolean = macro Ops.binop[A, Boolean]
def <=(rhs: A): Boolean = macro Ops.binop[A, Boolean]

def partialCompare(rhs: A): Double = A.partialCompare(lhs, rhs)
def tryCompare(rhs: A): Option[Int] = A.tryCompare(lhs, rhs)
def pmin(rhs: A): Option[A] = A.pmin(lhs, rhs)
def pmax(rhs: A): Option[A] = A.pmax(lhs, rhs)
def partialCompare(rhs: A): Double = macro Ops.binop[A, Double]
def tryCompare(rhs: A): Option[Int] = macro Ops.binop[A, Option[Int]]
def pmin(rhs: A): Option[A] = macro Ops.binop[A, Option[A]]
def pmax(rhs: A): Option[A] = macro Ops.binop[A, Option[A]]
}
4 changes: 2 additions & 2 deletions data/src/main/scala/cats/data/Const.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package cats.data
package cats
package data

import algebra._
import cats.{Applicative, Apply, Lazy, Show, Traverse}

/**
Expand Down
1 change: 0 additions & 1 deletion data/src/main/scala/cats/data/Or.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package cats
package data

import Or.{LeftOr, RightOr}
import algebra.{PartialOrder, Eq, Order, Monoid}
import cats.functor.Invariant

import scala.reflect.ClassTag
Expand Down
1 change: 0 additions & 1 deletion laws/src/main/scala/cats/laws/ComonadLaws.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package cats.laws

import algebra.Eq
import algebra.laws._

import org.scalacheck.{Arbitrary, Prop}
Expand Down
1 change: 0 additions & 1 deletion laws/src/main/scala/cats/laws/FunctorLaws.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package cats.laws

import algebra.Eq
import algebra.laws._

import org.typelevel.discipline.Laws
Expand Down
18 changes: 18 additions & 0 deletions macros/src/main/scala/cats/macros/Ops.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package cats.macros

object Ops extends machinist.Ops {

def uesc(c: Char): String = "$u%04X".format(c.toInt)

val operatorNames: Map[String, String] =
Map(
("$eq$eq$eq", "eqv"),
("$eq$bang$eq", "neqv"),
("$greater", "gt"),
("$greater$eq", "gteqv"),
("$less", "lt"),
("$less$eq", "lteqv"),
("$bar$plus$bar", "combine"),
("$bar$minus$bar", "remove")
)
}