package openmods.utils.io;

import io.netty.buffer.ByteBuf;
import java.io.ByteArrayInputStream;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.EOFException;
import java.io.InputStream;
import java.io.OutputStream;

public class StreamAdapters {
	public static IByteSink createSink(final DataOutput output) {
		return output::write;
	}

	public static IByteSink createSink(final OutputStream output) {
		return output::write;
	}

	public static IByteSink createSink(final ByteBuf output) {
		return output::writeByte;
	}

	public static IByteSource createSource(final DataInput input) {
		return input::readByte;
	}

	public static IByteSource createSource(final InputStream input) {
		return () -> {
			final int b = input.read();
			if (b < 0) throw new EOFException();
			return b;
		};
	}

	public static IByteSource createSource(final ByteBuf output) {
		return () -> {
			try {
				return output.readUnsignedByte();
			} catch (IndexOutOfBoundsException e) {
				throw new EOFException();
			}
		};
	}

	public static IByteSource createSource(byte[] bytes) {
		return createSource(new ByteArrayInputStream(bytes));
	}
}