summaryrefslogtreecommitdiff
path: root/src/main/scala/forge/Evaluator.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/forge/Evaluator.scala')
-rw-r--r--src/main/scala/forge/Evaluator.scala37
1 files changed, 20 insertions, 17 deletions
diff --git a/src/main/scala/forge/Evaluator.scala b/src/main/scala/forge/Evaluator.scala
index 43b4f353..1bff722b 100644
--- a/src/main/scala/forge/Evaluator.scala
+++ b/src/main/scala/forge/Evaluator.scala
@@ -2,6 +2,7 @@ package forge
import java.nio.{file => jnio}
+import play.api.libs.json.Json
import sourcecode.Enclosing
import scala.collection.mutable
@@ -9,8 +10,7 @@ import scala.collection.mutable
class Evaluator(workspacePath: jnio.Path,
enclosingBase: DefCtx){
- val resultCache = mutable.Map.empty[String, (Int, Any)]
-
+ val resultCache = mutable.Map.empty[String, (Int, String)]
def evaluate(targets: Seq[Target[_]]): Evaluator.Results = {
jnio.Files.createDirectories(workspacePath)
@@ -20,26 +20,29 @@ class Evaluator(workspacePath: jnio.Path,
for (target <- sortedTargets){
val inputResults = target.inputs.map(results).toIndexedSeq
- val targetDestPath = {
- val enclosingStr = target.defCtx.label
- val targetDestPath = workspacePath.resolve(
- jnio.Paths.get(enclosingStr.stripSuffix(enclosingBase.label))
- )
- deleteRec(targetDestPath)
- targetDestPath
-
- }
+ val enclosingStr = target.defCtx.label
+ val targetDestPath = workspacePath.resolve(
+ jnio.Paths.get(enclosingStr.stripSuffix(enclosingBase.label))
+ )
+ deleteRec(targetDestPath)
val inputsHash = inputResults.hashCode
- resultCache.get(target.defCtx.label) match{
- case Some((hash, res)) if hash == inputsHash && !target.dirty =>
- results(target) = res
+ (target.dirty, resultCache.get(target.defCtx.label)) match{
+ case (Some(dirtyCheck), Some((hash, res)))
+ if hash == inputsHash && !dirtyCheck() =>
+ results(target) = target.formatter.reads(Json.parse(res)).get
+
case _ =>
evaluated.append(target)
- val res = target.evaluate(new Args(inputResults, targetDestPath))
+ if (target.defCtx.anonId.isDefined && target.dirty.isEmpty) {
+ val res = target.evaluate(new Args(inputResults, targetDestPath))
+ results(target) = res
+ }else{
+ val (res, serialized) = target.evaluateAndWrite(new Args(inputResults, targetDestPath))
+ resultCache(target.defCtx.label) = (inputsHash, serialized)
+ results(target) = res
+ }
- resultCache(target.defCtx.label) = (inputsHash, res)
- results(target) = res
}
}