package fr.openwide.core.wicket.more.markup.html.factory;
import org.javatuples.Unit;
import com.google.common.base.Function;
import fr.openwide.core.commons.util.functional.SerializableFunction;
import fr.openwide.core.wicket.more.util.model.Detachables;
public final class DetachableFactories {
private DetachableFactories() {
}
public static final <T, R> IDetachableFactory<Unit<? extends T>, R> forUnit(final IDetachableFactory<T, R> factory) {
return new AbstractDetachableFactory<Unit<? extends T>, R>() {
private static final long serialVersionUID = 1L;
@Override
public R create(Unit<? extends T> parameter) {
return factory.create(parameter.getValue0());
}
@Override
public void detach() {
super.detach();
Detachables.detach(factory);
}
};
}
public static final <A, B, R> IDetachableFactory<A, R> compose(final IDetachableFactory<B, R> factory,
final Function<A, ? extends B> function) {
return new AbstractDetachableFactory<A, R>() {
private static final long serialVersionUID = 1L;
@Override
public R create(A parameter) {
return factory.create(function.apply(parameter));
}
@Override
public void detach() {
super.detach();
Detachables.detach(factory);
}
};
}
public static final <A, B, R> IDetachableFactory<A, R> compose(final IDetachableFactory<B, R> first,
final IDetachableFactory<A, ? extends B> second) {
return new AbstractDetachableFactory<A, R>() {
private static final long serialVersionUID = 1L;
@Override
public R create(A parameter) {
return first.create(second.create(parameter));
}
@Override
public void detach() {
super.detach();
Detachables.detach(first, second);
}
};
}
public static final <T, R> Function<IDetachableFactory<T, R>, R> toApplyFunction(final T parameter) {
return new SerializableFunction<IDetachableFactory<T, R>, R>() {
private static final long serialVersionUID = 1L;
@Override
public R apply(IDetachableFactory<T, R> input) {
return input.create(parameter);
}
};
}
}