package net.varkhan.base.functor.curry;
import net.varkhan.base.functor._;
/**
* <b></b>.
* <p/>
*
* @author varkhan
* @date 12/1/13
* @time 12:33 PM
*/
public interface CTuple<L, _T extends _> extends Tuple<L,_T> {
public Class<L> ltype();
public L lvalue();
public _T _value();
public Class<?>[] types();
public Object[] values();
public static class Value<L,_T extends _> extends Tuple.Value<L,_T> implements CTuple<L,_T> {
protected final Class<?>[] types;
public Value(CTuple<L,? extends _T> t) {
super(t.values());
this.types=t.types();
}
public Value(Class<L> lc, Class<?>[] types, L l, Object[] values) {
super(uncurry(l,values));
this.types=uncurry(lc,types);
}
protected Value(Class<?>[] types, Object[] values) {
super(values);
this.types=types;
}
protected static <T> Class<?>[] uncurry(Class<T> l, Class<?>[] values) {
if(values==null||values.length==0) return new Class[]{l};
Class[] v = new Class[1+values.length];
v[0] = l;
System.arraycopy(values,0,v,1,values.length);
return v;
}
@SuppressWarnings("unchecked")
protected static <T> Class<T>[] rcurry(Class<T>[] values) {
if(values==null||values.length<=1) return new Class[0];
Class[] v = new Class[values.length-1];
System.arraycopy(values,1,v,0,values.length-1);
return v;
}
@SuppressWarnings("unchecked")
public _T _value() { return (values==null||values.length<=1)?null:(_T) new CTuple.Value(rcurry(types),rcurry(values)); }
@SuppressWarnings("unchecked")
public Class<L> ltype() { return (Class<L>) types[0]; }
public Class<?>[] types() { return types; }
}
}