com.github.hakenadu.javalangchains.chains.base.JoinChain Maven / Gradle / Ivy
package com.github.hakenadu.javalangchains.chains.base;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;
import com.github.hakenadu.javalangchains.chains.Chain;
/**
* This {@link Chain} is used to join multiple other chains. Their output is
* provided as a {@link Stream} which will be passed as an input to subsequent
* chains.
*
* @param Input type of joined chains
* @param Output type of joined chains
*/
public final class JoinChain implements Chain> {
/**
* the list of joined {@link Chain Chains}
*/
private final List> chains;
/**
* if true
the result stream will be a parallel one
*/
private final boolean parallel;
/**
* @param parallel {@link #parallel}
* @param chains {@link #chains}
*/
public JoinChain(final boolean parallel, final List> chains) {
this.parallel = parallel;
this.chains = chains;
}
/**
* @param chains {@link #chains}
*/
public JoinChain(final List> chains) {
this(false, chains);
}
/**
* @param parallel {@link #parallel}
* @param chains {@link #chains}
*/
@SafeVarargs
public JoinChain(final boolean parallel, final Chain... chains) {
this(parallel, Arrays.asList(chains));
}
/**
* @param chains {@link #chains}
*/
@SafeVarargs
public JoinChain(final Chain... chains) {
this(false, chains);
}
@Override
public Stream run(final I input) {
final Stream result = chains.stream().map(chain -> chain.run(input));
if (parallel) {
return result.parallel();
}
return result;
}
}