package ch.wlkl.shell;

import java.io.File;
import java.io.IOException;
import java.lang.reflect.Array;
import java.util.Collection;

public class Ut<T> {
	public final static Ut<String> string = new Ut<String>(String.class);

	public static  <C, A extends C> void addAll(Collection<C> col, A... arr) {
		if (arr != null)
			for (A a: arr)
				col.add(a);		
	}

	public static  <C> C[] array(C... eles) {
		return eles;
	}

	public static  <C> C[] put(C[] dest, int from, C... eles) {
		for (int ex=0; ex < eles.length; ex++)
			dest[from+ex] = eles[ex];
		return dest;
	}

	public static  <C> C[] copy(C[] dst, int frDst, C[] src, int frSrc) {
		for (int sx=frSrc; sx < src.length; sx++)
			dst[frDst+sx-frSrc] = src[sx];
		return dst;
	}

	public static  <C, A extends C> void write(Write<C> wri, A... arr) {
		for (A a: arr)
			wri.write(a);		
	}
	
	public static <W, R extends W> void write(Write<W> w, Read<R> r) {
		W one;
		while (null != (one = r.read()))
			w.write(one);
	}
	
	public static String crLf(String s) {
		int rx = s.indexOf('\r');
		int nx = s.indexOf('\n');
		while (rx >= 0 && nx == rx+1) {
			rx = s.indexOf('\r', nx+1);
			nx = s.indexOf('\n', nx+1);
		}
		if (rx < 0 && nx < 0)
			return s;
		int bx = 0;
		StringBuffer res = new StringBuffer();
		while (true) {
			if (rx >= 0 && nx == rx+1) {
			rx = s.indexOf('\r', nx+1);
			nx = s.indexOf('\n', nx+1);
			} else if (rx >= 0 && (nx < 0 || nx > rx)) {
				res.append(s, bx, nx).append("\r\n");
				rx = s.indexOf('\r', bx=rx+1);
			} else if (nx >= 0) {
				res.append(s, bx, nx).append("\r\n");
				nx = s.indexOf('\n', bx = nx+1);
			} else {
				return res.append(s, bx, s.length()).toString();
			}
		}
	}
	
	public static File canonical(File f) {
		try {
			return f.getCanonicalFile();
		} catch (IOException e) {
			return f.getAbsoluteFile();
		}
	}

	public static String cat(Read<String> rdr, String mid) {
		StringBuffer b = new StringBuffer();
		String line;
		rdr.open("-r");
		while (null != (line = rdr.read()))
			b.append(line).append(mid);
		return b.substring(0, b.length() == 0 ? 0 : b.length() - mid.length());
	}
	
	@SuppressWarnings("unchecked")
	public static <C> C[] asArray(Class<C> cl, Collection<? extends C> col) {
		return col.toArray((C[]) Array.newInstance(cl, col.size()));
	}

	public static void preSuf(String pre, String suf) {
		String one;
		while (null != (one = EnvMan.env().read()))
			EnvMan.env().write(pre + one + suf);
	}

	Class<T> clazz;
	Ut(Class<T> cl) {
		clazz = cl;
	}
	public T[] asArray(Collection<? extends T> col) {
		return asArray(clazz, col);
	}
}
