package org.core4j;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Map.Entry;
import org.core4j.xml.XElement;
public class Funcs {
public static <TResult> Func1<TResult, TResult> identity(Class<TResult> clazz) {
return new Func1<TResult, TResult>() {
public TResult apply(TResult input) {
return input;
}
};
}
public static <TResult> Func<TResult> constant(final TResult value) {
return new Func<TResult>() {
public TResult apply() {
return value;
}
};
}
public static <T, TResult> Func1<T, TResult> wrap(final ThrowingFunc1<T, TResult> fn) {
return new Func1<T, TResult>() {
public TResult apply(T input) {
try {
return fn.apply(input);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
}
public static <TResult> Func<TResult> wrap(final ThrowingFunc<TResult> fn) {
return new Func<TResult>() {
public TResult apply() {
try {
return fn.apply();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
};
}
public static <TObject, TField> Func1<TObject, TField> field(Class<TObject> objectClass, Class<TField> fieldClass, String fieldName) {
try {
final Field field = objectClass.getField(fieldName);
return wrap(new ThrowingFunc1<TObject, TField>() {
@SuppressWarnings("unchecked")
public TField apply(TObject input) throws Exception {
return (TField) field.get(input);
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static Func1<XElement, String> elementValue() {
return new Func1<XElement, String>() {
public String apply(XElement input) {
return input.getValue();
}
};
}
public static <TWhatever, TConstant> Func1<TWhatever, TConstant> constant(Class<TWhatever> whateverClass, final TConstant constant) {
return new Func1<TWhatever, TConstant>() {
public TConstant apply(TWhatever input) {
return constant;
}
};
}
public static <TKey, TValue> Func1<Entry<TKey, TValue>, TKey> mapEntryKey() {
return new Func1<Entry<TKey, TValue>, TKey>() {
public TKey apply(Entry<TKey, TValue> input) {
return input.getKey();
}
};
}
public static <TKey, TValue> Func1<Entry<TKey, TValue>, TValue> mapEntryValue(Map<TKey, TValue> values) {
return new Func1<Entry<TKey, TValue>, TValue>() {
public TValue apply(Entry<TKey, TValue> input) {
return input.getValue();
}
};
}
public static <TInstance, TReturn> Func1<TInstance, TReturn> method(final Class<TInstance> instanceClass, Class<TReturn> returnClass, final String methodName) {
return Funcs.wrap(new ThrowingFunc1<TInstance, TReturn>() {
@SuppressWarnings("unchecked")
public TReturn apply(TInstance input) throws Exception {
Method method = instanceClass.getMethod(methodName);
Object rt = method.invoke(input);
return (TReturn) rt;
}
});
}
}