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

com.lumiomedical.flow.Join Maven / Gradle / Ivy

package com.lumiomedical.flow;

import com.lumiomedical.flow.actor.generator.Generator;
import com.lumiomedical.flow.actor.loader.Loader;
import com.lumiomedical.flow.actor.transformer.BiTransformer;
import com.lumiomedical.flow.actor.transformer.Transformer;
import com.lumiomedical.flow.interruption.Interruption;
import com.lumiomedical.flow.io.output.Recipient;
import com.lumiomedical.flow.node.BiNode;
import com.lumiomedical.flow.stream.StreamGenerator;

import java.util.function.Function;
import java.util.function.Predicate;

/**
 * Joins are a point of passage joining two upstream branchs of a DAG.
 * They accept two inputs from upstream, produce a joined output using a provided BiTransformer implementation, then pass it downstream.
 *
 * @author Pierre Lecerf ([email protected])
 * Created on 2020/03/01
 */
public class Join extends BiNode implements FlowOut
{
    private final BiTransformer actor;

    /**
     *
     * @param input1
     * @param input2
     * @param actor
     */
    public Join(FlowOut input1, FlowOut input2, BiTransformer actor)
    {
        super(input1, input2);
        this.actor = actor;
    }

    /**
     *
     * @return
     */
    public BiTransformer getActor()
    {
        return this.actor;
    }

    @Override
    public  Pipe into(Transformer transformer)
    {
        var pipe = new Pipe<>(transformer);
        this.bind(pipe);
        return pipe;
    }

    @Override
    public Sink into(Loader loader)
    {
        var sink = new Sink<>(loader);
        this.bind(sink);
        return sink;
    }

    @Override
    public  Join join(FlowOut input, BiTransformer transformer)
    {
        return new Join<>(this, input, transformer);
    }

    @Override
    public  StreamGenerator stream(Function> generatorSupplier)
    {
        var pipe = new StreamGenerator<>(generatorSupplier);
        this.bind(pipe);
        return pipe;
    }

    /**
     *
     * @param loader
     * @return
     */
    public Join driftSink(Loader loader)
    {
        this.into(loader);
        return this;
    }

    @Override
    public Recipient collect(String name)
    {
        Recipient recipient = new Recipient<>(name);
        this.bind(recipient);
        return recipient;
    }

    /**
     *
     * @param name
     * @return
     */
    public Join sample(String name)
    {
        this.collect(name);
        return this;
    }


    /**
     *
     * @return
     */
    public Pipe interrupt()
    {
        return this.into(new Interruption<>());
    }

    /**
     *
     * @param predicate
     * @return
     */
    public Pipe interruptIf(Predicate predicate)
    {
        return this.into(new Interruption<>(predicate));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy