All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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