package jazz.io;
///////////////////////////////////////////////////////////////////////////////
//
// Writers
//
// Output operations are imperative operations that must be explicitly
// serialized in order to guarantee the order in which they are performed.
//
///////////////////////////////////////////////////////////////////////////////
public abstract class Writer {
// Underlying native writer
writer: native;
// Write methods returning a new object that can be used to
// perform further writes with a guarantee of sequentiality
public writeChar(b: int): alike;
public writeString(s: String): alike;
// Same thing, but on arrays
public writeCharArray(n: int)(b: int[n]): alike;
public writeStringArray(n: int)(s: String[n]): alike;
// Flushes the writer
public flush(): alike;
// Flushes and closes the writer
public close(): alike;
}
///////////////////////////////////////////////////////////////////////////////
//
// Implementation
//
///////////////////////////////////////////////////////////////////////////////
writeChar@Writer(b) =
(native("void java.io.Writer.write(int)", writer, b)
; flush()
; this);
writeString@Writer(s) =
(native("void java.io.Writer.write(java.lang.String)", writer, s)
; flush()
; this);
flush@Writer() = (native("void java.io.Writer.flush()", writer)
; this);
close@Writer() = (native("void java.io.Writer.close()", writer)
; this);
writeCharArray@Writer(n)(b) = fw[n]
{
fw = [this, i -> fw[i-1].writeChar(b[i-1])];
}
writeStringArray@Writer(n)(b) = fw[n]
{
fw = [this, i -> fw[i-1].writeString(b[i-1])];
}