package com.googlecode.totallylazy.transducers; import com.googlecode.totallylazy.annotations.multimethod; import com.googlecode.totallylazy.multi; import java.util.List; public class CompositeSender<A, B> implements Sender<B> { private final Sender<A> sender; private final Transducer<A, B> transducer; private CompositeSender(Sender<A> sender, Transducer<A, B> transducer) { this.sender = sender; this.transducer = transducer; } @multimethod static <A, B, C> CompositeSender<A, C> compositeSender(CompositeSender<A, B> sender, Transducer<B, C> transducer) { return compositeSender(sender.sender, Transducers.compose(sender.transducer, transducer)); } private static multi method; static <A, B> CompositeSender<A, B> compositeSender(Sender<A> sender, Transducer<A, B> transducer) { if(method == null) method = new multi() { }; return method.<CompositeSender<A, B>>methodOption(sender, transducer). getOrElse(() -> new CompositeSender<>(sender, transducer)); } @Override public AutoCloseable send(Receiver<B> receiver) { return sender.send(transducer.apply(receiver)); } public Sender<A> sender() { return sender; } public Transducer<A, B> transducer() { return transducer; } public List<Transducer<?, ?>> transducers() { return CompositeTransducer.transducers(transducer); } }