ConverterPublisher.java

package eu.javaexperience.transform;

import java.util.ArrayList;
import java.util.List;

import eu.javaexperience.collection.PublisherCollection;
import eu.javaexperience.interfaces.simple.getBy.GetBy1;

public abstract class ConverterPublisher<From, To> extends PublisherCollection<From>
{
	protected ArrayList<To> dst = new ArrayList<>();
	
	public List<To> getDestination()
	{
		return dst;
	}
	
	protected boolean preFilter(From f)
	{
		return true;
	}
	
	protected boolean postFilter(From f, To t)
	{
		return true;
	}
	
	protected abstract To transform(From t);
	
	@Override
	public boolean add(From obj)
	{
		if(preFilter(obj))
		{
			To t = transform(obj);
			if(postFilter(obj, t))
			{
				dst.add(t);
				return true;
			}
		}
		
		return false;
	}
	
	
	public static <From, To> ConverterPublisher<From, To> createFromGetBy(final GetBy1<To, From> converter)
	{
		return new ConverterPublisher<From, To>()
		{
			@Override
			protected To transform(From t)
			{
				return converter.getBy(t);
			}
		};
	}
	
	public static <From, To> ConverterPublisher<From, To> createFromGetByWithPreFilter(final GetBy1<To, From> converter, final GetBy1<Boolean, From> preFilter)
	{
		return new ConverterPublisher<From, To>()
		{
			@Override
			protected boolean preFilter(From f)
			{
				return Boolean.TRUE == preFilter.getBy(f);
			}
			
			@Override
			protected To transform(From t)
			{
				return converter.getBy(t);
			}
		};
	}
}