summaryrefslogtreecommitdiff
path: root/core/src/main/scala/forge/define
diff options
context:
space:
mode:
authorLi Haoyi <haoyi.sg@gmail.com>2017-11-07 21:10:06 -0800
committerLi Haoyi <haoyi.sg@gmail.com>2017-11-07 21:11:03 -0800
commitee080e63971399ceb22fd8f059a97e956d9f0dcb (patch)
treeaa4ce5a9b6647835fbdae11266621f13d24dcfcb /core/src/main/scala/forge/define
parentca02aef2c98079c695fa616c75ab05a693c9d512 (diff)
downloadmill-ee080e63971399ceb22fd8f059a97e956d9f0dcb.tar.gz
mill-ee080e63971399ceb22fd8f059a97e956d9f0dcb.tar.bz2
mill-ee080e63971399ceb22fd8f059a97e956d9f0dcb.zip
- Allow main methods to return `Target[T]`s, so they can then be evaled by an external `Evaluator` that has the `Discovered` mapping available
- Basic integration tests for `T.command` entrypoint running in the `JavaCompilerJarTests` suite
Diffstat (limited to 'core/src/main/scala/forge/define')
-rw-r--r--core/src/main/scala/forge/define/Applicative.scala2
-rw-r--r--core/src/main/scala/forge/define/Target.scala12
2 files changed, 8 insertions, 6 deletions
diff --git a/core/src/main/scala/forge/define/Applicative.scala b/core/src/main/scala/forge/define/Applicative.scala
index 6a4d1d0c..dfa0cf84 100644
--- a/core/src/main/scala/forge/define/Applicative.scala
+++ b/core/src/main/scala/forge/define/Applicative.scala
@@ -7,7 +7,7 @@ import scala.collection.mutable
import scala.reflect.macros.blackbox.Context
object Applicative {
- trait Applyable[T]{
+ trait Applyable[+T]{
@compileTimeOnly("Target#apply() can only be used with a T{...} block")
def apply(): T = ???
}
diff --git a/core/src/main/scala/forge/define/Target.scala b/core/src/main/scala/forge/define/Target.scala
index 98bd1b7c..753a63e8 100644
--- a/core/src/main/scala/forge/define/Target.scala
+++ b/core/src/main/scala/forge/define/Target.scala
@@ -9,7 +9,7 @@ import play.api.libs.json.{Format, Json}
import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
-abstract class Target[T] extends Target.Ops[T] with Applyable[T]{
+abstract class Target[+T] extends Target.Ops[T] with Applyable[T]{
/**
* What other Targets does this Target depend on?
*/
@@ -27,8 +27,10 @@ abstract class Target[T] extends Target.Ops[T] with Applyable[T]{
def sideHash: Int = 0
}
+
object Target extends Applicative.Applyer[Target, Target]{
def underlying[A](v: Target[A]) = v
+
type Cacher = forge.define.Cacher[Target[_]]
class Target0[T](t: T) extends Target[T]{
lazy val t0 = t
@@ -46,7 +48,7 @@ object Target extends Applicative.Applyer[Target, Target]{
)
}
- abstract class Ops[T]{ this: Target[T] =>
+ abstract class Ops[+T]{ this: Target[T] =>
def map[V](f: T => V) = new Target.Mapped(this, f)
def filter(f: T => Boolean) = this
@@ -58,18 +60,18 @@ object Target extends Applicative.Applyer[Target, Target]{
def traverse[T](source: Seq[Target[T]]) = {
new Traverse[T](source)
}
- class Traverse[T](val inputs: Seq[Target[T]]) extends Target[Seq[T]]{
+ class Traverse[+T](val inputs: Seq[Target[T]]) extends Target[Seq[T]]{
def evaluate(args: Args) = {
for (i <- 0 until args.length)
yield args(i).asInstanceOf[T]
}
}
- class Mapped[T, V](source: Target[T], f: T => V) extends Target[V]{
+ class Mapped[+T, +V](source: Target[T], f: T => V) extends Target[V]{
def evaluate(args: Args) = f(args(0))
val inputs = List(source)
}
- class Zipped[T, V](source1: Target[T], source2: Target[V]) extends Target[(T, V)]{
+ class Zipped[+T, +V](source1: Target[T], source2: Target[V]) extends Target[(T, V)]{
def evaluate(args: Args) = (args(0), args(1))
val inputs = List(source1, source2)
}