diff options
author | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-09 04:56:36 -0800 |
---|---|---|
committer | Li Haoyi <haoyi.sg@gmail.com> | 2017-11-09 04:56:36 -0800 |
commit | fd545a9ae9f41a4bfdc2bf13a4554943f206f92b (patch) | |
tree | bfb76d137529f95026d4b576cd9bef154dabe531 /core/src/main/scala/forge/define/Target.scala | |
parent | cdecfeedc1900aff0c4acfd284b07bf36087c3c9 (diff) | |
download | mill-fd545a9ae9f41a4bfdc2bf13a4554943f206f92b.tar.gz mill-fd545a9ae9f41a4bfdc2bf13a4554943f206f92b.tar.bz2 mill-fd545a9ae9f41a4bfdc2bf13a4554943f206f92b.zip |
Make `Applicative` macros able to inject a configurable `Ctx` object, used in `Target` to inject the `dest` folder for the `T{...}` block to use
Diffstat (limited to 'core/src/main/scala/forge/define/Target.scala')
-rw-r--r-- | core/src/main/scala/forge/define/Target.scala | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/core/src/main/scala/forge/define/Target.scala b/core/src/main/scala/forge/define/Target.scala index 9cb2dd1a..667fe467 100644 --- a/core/src/main/scala/forge/define/Target.scala +++ b/core/src/main/scala/forge/define/Target.scala @@ -29,7 +29,7 @@ abstract class Target[+T] extends Target.Ops[T] with Applyable[T]{ } -object Target extends Applicative.Applyer[Target, Target]{ +object Target extends Applicative.Applyer[Target, Target, Args]{ def underlying[A](v: Target[A]) = v type Cacher = forge.define.Cacher[Target[_]] @@ -39,18 +39,20 @@ object Target extends Applicative.Applyer[Target, Target]{ def evaluate(args: Args) = t0 } def apply[T](t: Target[T]): Target[T] = macro forge.define.Cacher.impl0[Target, T] - def command[T](t: T): Target[T] = macro Applicative.impl[Target, T] - def apply[T](t: T): Target[T] = macro impl[Target, T] - def impl[M[_], T: c.WeakTypeTag](c: Context) - (t: c.Expr[T]) - (implicit tt: c.WeakTypeTag[M[_]]): c.Expr[M[T]] = { - forge.define.Cacher.wrapCached(c)( - Applicative.impl(c)(t) + def command[T](t: T): Target[T] = macro Applicative.impl[Target, T, Args] + def apply[T](t: T): Target[T] = macro impl[Target, T, Args] + def impl[M[_], T: c.WeakTypeTag, Ctx: c.WeakTypeTag] + (c: Context) + (t: c.Expr[T]) + (implicit tt: c.WeakTypeTag[M[_]]): c.Expr[M[T]] = { + forge.define.Cacher.wrapCached[M, T](c)( + Applicative.impl[M, T, Ctx](c)(t) ) } abstract class Ops[+T]{ this: Target[T] => def map[V](f: T => V) = new Target.Mapped(this, f) + def mapDest[V](f: (T, Args) => V) = new Target.MappedDest(this, f) def filter(f: T => Boolean) = this def withFilter(f: T => Boolean) = this @@ -72,6 +74,10 @@ object Target extends Applicative.Applyer[Target, Target]{ def evaluate(args: Args) = f(args(0)) val inputs = List(source) } + class MappedDest[+T, +V](source: Target[T], f: (T, Args) => V) extends Target[V]{ + def evaluate(args: Args) = f(args(0), args) + val inputs = List(source) + } 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) @@ -106,7 +112,7 @@ object Target extends Applicative.Applyer[Target, Target]{ } } - def map[A, B](t: Target[A], f: A => B) = t.map(f) + def mapCtx[A, B](t: Target[A])(f: (A, Args) => B) = t.mapDest(f) def zip() = new Target.Target0(()) def zip[A](a: Target[A]) = a.map(Tuple1(_)) def zip[A, B](a: Target[A], b: Target[B]) = a.zip(b) |