package com.googlecode.totallylazy.transducers; import java.util.List; import static com.googlecode.totallylazy.Lists.list; import static com.googlecode.totallylazy.Unchecked.cast; public interface CompositeTransducer<A, B, C> extends Transducer<A, C> { Transducer<A, B> a(); Transducer<B, C> b(); static <A, B, C> Transducer<A, C> compositeTransducer(Transducer<A, B> a, Transducer<B, C> b) { if(a instanceof IdentityTransducer) return cast(b); if(b instanceof IdentityTransducer) return cast(a); return new CompositeTransducer<A,B,C>(){ @Override public Transducer<A, B> a() { return a; } @Override public Transducer<B, C> b() { return b; } }; } @Override default Receiver<A> apply(Receiver<C> receiver) {return a().apply(b().apply(receiver));} default List<Transducer<?, ?>> transducers() { return transducers(this); } static List<Transducer<?, ?>> transducers(Transducer<?, ?> transducer) { if(transducer instanceof CompositeTransducer) { CompositeTransducer compositeTransducer = (CompositeTransducer) transducer; List<Transducer<?, ?>> transducers = transducers(compositeTransducer.a()); transducers.addAll(transducers(compositeTransducer.b())); return transducers; } return list(transducer); } }