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

com.github.dakusui.actionunit.actions.ForEach Maven / Gradle / Ivy

package com.github.dakusui.actionunit.actions;

import com.github.dakusui.actionunit.core.Action;
import com.github.dakusui.actionunit.core.ValueHandlerActionFactory;

import static com.github.dakusui.actionunit.helpers.InternalUtils.describe;
import static com.github.dakusui.actionunit.helpers.InternalUtils.summary;
import static java.util.Objects.requireNonNull;

public interface ForEach extends Action {
  Iterable data();

  Action createHandler(ValueHolder data);

  Mode getMode();

  ValueHolder defaultValue();

  static  ForEach.Builder builder(int id, Iterable elements) {
    return new ForEach.Builder<>(id, elements);
  }

  class Builder {
    private final Iterable elements;
    private final int                   id;
    private Mode mode = Mode.SEQUENTIALLY;
    private ValueHolder defaultValue;

    Builder(int id, Iterable elements) {
      this.id = id;
      this.elements = requireNonNull(elements);
      this.defaultValue = ValueHolder.empty();
    }

    public Builder withDefault(E defaultValue) {
      this.defaultValue = ValueHolder.of(defaultValue);
      return this;
    }

    public Builder sequentially() {
      this.mode = Mode.SEQUENTIALLY;
      return this;
    }

    public Builder concurrently() {
      this.mode = Mode.CONCURRENTLY;
      return this;
    }

    public ForEach perform(ValueHandlerActionFactory operation) {
      requireNonNull(operation);
      //noinspection unchecked
      return new ForEach.Impl<>(
          id,
          operation,
          (Iterable) this.elements,
          this.mode,
          defaultValue);
    }

    public ForEach perform(Action action) {
      requireNonNull(action);
      return perform((factory, data) -> action);
    }

  }

  enum Mode {
    SEQUENTIALLY,
    CONCURRENTLY
  }

  class Impl extends ActionBase implements ForEach {
    private final ValueHandlerActionFactory handlerFactory;
    private final Iterable                  data;
    private final Mode                         mode;
    private final ValueHolder               defaultValue;

    public Impl(int id, ValueHandlerActionFactory handlerFactory, Iterable data, Mode mode, ValueHolder defaultValue) {
      super(id);
      this.handlerFactory = requireNonNull(handlerFactory);
      this.data = requireNonNull(data);
      this.mode = requireNonNull(mode);
      this.defaultValue = requireNonNull(defaultValue);
    }

    @Override
    public Iterable data() {
      return this.data;
    }

    @Override
    public Action createHandler(ValueHolder data) {
      return this.handlerFactory.apply(data);
    }

    @Override
    public Mode getMode() {
      return this.mode;
    }

    @Override
    public ValueHolder defaultValue() {
      return defaultValue;
    }

    @Override
    public void accept(Visitor visitor) {
      visitor.visit(this);
    }

    @Override
    public String toString() {
      return String.format("%s (%s) %s", super.toString(), mode, summary(describe(this.data)));
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy