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

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;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy