SaacUtilsFunctions.java

package eu.javaexperience.saac;

import eu.javaexperience.interfaces.simple.getBy.GetBy1;
import eu.javaexperience.reflect.CastTo;
import eu.javaexperience.reflect.Mirror;

public class SaacUtilsFunctions
{
	public static <T> GetBy1<Boolean, T> isEqualsWith(T object)
	{
		return new GetBy1<Boolean, T>()
		{
			@Override
			public Boolean getBy(T a)
			{
				if(Mirror.equals(a, object))
				{
					return true;
				}
				
				return Mirror.equals(castTo(a, object), a);
			}
		};
	}
	
	public static <T, R> GetBy1<Boolean, T> isResultsEquals(GetBy1<R, T> a, GetBy1<R, T> b)
	{
		return new GetBy1<Boolean, T>()
		{
			@Override
			public Boolean getBy(T p)
			{
				R A = a.getBy(p);
				R B = b.getBy(p);
				return isEquals(A, B);
			}
		};
	}
	
	public static <T> boolean isEquals(T a, T b)
	{
		return Mirror.equals(a, b)
			|| 
				Mirror.equals(castTo(b, a), b)
			||
				Mirror.equals(a, castTo(a, b))
			;
	}
	
	protected static Object castTo(Object to, Object object)
	{
		CastTo t = CastTo.getCasterRestrictlyForTargetClass(to.getClass());
		if(null != t)
		{
			return t.cast(object);
		}
		return object;
	}
}