Generic buffered I/O for Carp.
(load "git@github.com:carpentry-org/bufio@0.1.0")BufReader wraps any stream that implements the stream-read and
stream-write interfaces, providing buffered line-oriented and
size-delimited reading, and buffered writing.
The socket library implements the
interfaces for TcpStream:
(match (TcpStream.connect "example.com" 80)
(Result.Success s)
(let [br (TcpStream.buffered s)]
(do
(BufReader.write &br "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n")
(ignore (BufReader.flush &br))
(match (BufReader.read-line &br)
(Result.Success line) (println* &line)
(Result.Error e) (IO.errorln &e))
(BufReader.delete br)))
(Result.Error e) (IO.errorln &e))Define three interface functions for your stream type:
; stream-read: read up to `len` bytes into buf, return bytes read
(definterface stream-read (Fn [&a &(Array Byte) Int] Int))
; stream-write: write bytes, return bytes written
(definterface stream-write (Fn [&a &(Array Byte)] Int))
; stream-close: close the stream
(definterface stream-close (Fn [a] ()))Then provide a buffered function that creates a BufReader via the C-level
BufReader_create_ with your type's adapter function pointers.
BufReader.read-line— read until\nBufReader.read-until— read until a delimiter byteBufReader.read-n— read exactly N bytesBufReader.read-append— append read data to a byte bufferBufReader.write— buffer string dataBufReader.write-bytes— buffer binary dataBufReader.flush— send buffered writesBufReader.clear-read/BufReader.clear-write— discard buffersBufReader.delete— close underlying stream and free buffers
carp -x test/bufio.carp
Have fun!