io.rouz.task.Task Maven / Gradle / Ivy
package io.rouz.task;
import com.google.auto.value.AutoValue;
import java.io.Serializable;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import io.rouz.task.dsl.TaskBuilder;
import io.rouz.task.dsl.TaskBuilder.F0;
/**
* TODO:
* d make inputs lazily instantiated to allow short circuiting graph generation
* . output task graph
* . external outputs - outputs that might already be available (ie a file on disk)
* - can be implemented with a regular task, but better support can be added
* . id task
*
* {@code Task(param1=value1, param2=valu2) => t}
*
* @param A type carrying the execution metadata of this task
*/
@AutoValue
public abstract class Task implements Serializable {
public abstract TaskId id();
abstract EvalClosure code();
abstract F0>> lazyInputs();
public List> inputs() {
return lazyInputs().get();
}
public Stream> inputsInOrder() {
return inputsInOrder(new HashSet<>());
}
private Stream> inputsInOrder(Set visits) {
return inputs().stream()
.filter(input -> !visits.contains(input.id()))
.flatMap(input -> {
visits.add(input.id());
return Stream.concat(
input.inputsInOrder(visits),
Stream.of(input)
);
});
}
public static TaskBuilder named(String taskName, Object... args) {
return TaskBuilders.rootBuilder(TaskId.create(taskName, args));
}
public static Task create(F0 code, String taskName, Object... args) {
return create(Collections::emptyList, tc -> tc.value(code), TaskId.create(taskName, args));
}
static Task create(F0>> inputs, EvalClosure code, TaskId taskId) {
return new AutoValue_Task<>(taskId, code, inputs);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy