package abs.fli.java.io;

import java.util.ArrayList;

import ABS.StdLib.List;
import ABS.StdLib.length_f;
import FLI.StreamUtils.Byte;
import FLI.StreamUtils.Byte_Byte;
import abs.backend.java.lib.types.ABSInteger;
import abs.fli.java.CollectionUtil;
import abs.fli.java.Fun;

/**
 * 
 * @author pwong
 *
 */
public class ByteUtil {
    private final CollectionUtil cutil = new CollectionUtil();

    private final Fun<Byte, java.lang.Byte> bTB = new Fun<Byte, java.lang.Byte>() {
        @Override
        public java.lang.Byte evaluate(Byte a) {
            return java.lang.Integer.valueOf(a.toByte().getArg0().toInt()).byteValue();
        }
    };
    
    private final Fun<java.lang.Byte, Byte> BTb = new Fun<java.lang.Byte, Byte>() {
        @Override
        public Byte evaluate(java.lang.Byte a) {
            return new Byte_Byte(ABSInteger.fromInt(a.intValue())); 
        }
    };
    
    public byte convert(Byte b) {
        return bTB.evaluate(b);
    }
    
    public Byte convert(byte b) {
        return BTb.evaluate(java.lang.Byte.valueOf(b));
    }
    
    public byte[] convert(List<Byte> bytes) {
        byte[] bs = new byte[length_f.apply(bytes).toInt()];
        java.util.List<java.lang.Byte> it = cutil.convert(bTB,bytes);
        for (int i=0; i<bs.length; i++) {
            bs[i] = it.get(i);
        }
        return bs;
    }
    
    public List<Byte> convert(byte[] bytes) {
        java.util.List<java.lang.Byte> java = new ArrayList<java.lang.Byte>(bytes.length);
        for (byte b : bytes) {
            java.add(java.lang.Byte.valueOf(b));
        }
        return cutil.convert(BTb,java);
    }
    
}
