--- /dev/null
+USING: tools.test io.streams.byte-array io.encodings.binary
+io.encodings.utf8 io kernel arrays strings ;
+
+[ B{ 1 2 3 } ] [ binary [ { 1 2 3 } write ] with-byte-writer ] unit-test
+[ B{ 1 2 3 } ] [ { 1 2 3 } binary [ 3 read ] with-byte-reader ] unit-test
+
+[ B{ BIN: 11110101 BIN: 10111111 BIN: 10000000 BIN: 10111111 BIN: 11101111 BIN: 10000000 BIN: 10111111 BIN: 11011111 BIN: 10000000 CHAR: x } ]
+[ { BIN: 101111111000000111111 BIN: 1111000000111111 BIN: 11111000000 CHAR: x } utf8 [ write ] with-byte-writer ] unit-test
+[ { BIN: 101111111000000111111 } t ] [ { BIN: 11110101 BIN: 10111111 BIN: 10000000 BIN: 10111111 } utf8 <byte-reader> contents dup >array swap string? ] unit-test
--- /dev/null
+USING: byte-arrays byte-vectors kernel io.encodings io.streams.string
+sequences io namespaces ;
+IN: io.streams.byte-array
+
+: <byte-writer> ( encoding -- stream )
+ 512 <byte-vector> swap <encoding> ;
+
+: with-byte-writer ( encoding quot -- byte-array )
+ >r <byte-writer> r> [ stdio get ] compose with-stream*
+ >byte-array ; inline
+
+: <byte-reader> ( byte-array encoding -- stream )
+ >r >byte-vector dup reverse-here r> <decoding> ;
+
+: with-byte-reader ( byte-array encoding quot -- )
+ >r <byte-reader> r> with-stream ; inline
IN: io.streams.string
USING: io kernel math namespaces sequences sbufs strings
generic splitting io.streams.plain io.streams.lines growable
-continuations byte-vectors io.encodings byte-arrays ;
+continuations ;
M: growable dispose drop ;
<string-writer> swap [ stdio get ] compose with-stream*
>string ; inline
-: <byte-writer> ( encoding -- stream )
- 512 <byte-vector> swap <encoding> ;
-
-: with-byte-writer ( encoding quot -- byte-array )
- >r <byte-writer> r> [ stdio get ] compose with-stream*
- >byte-array ; inline
-
: format-column ( seq ? -- seq )
[
[ 0 [ length max ] reduce ] keep
M: growable stream-read1 dup empty? [ drop f ] [ pop ] if ;
-: sbuf-read-until ( sbuf n -- str )
- tail-slice >string dup reverse-here ;
+: harden-as ( seq growble-exemplar -- newseq )
+ underlying like ;
+
+: growable-read-until ( growable n -- str )
+ dupd tail-slice swap harden-as dup reverse-here ;
: find-last-sep swap [ memq? ] curry find-last drop ;
M: growable stream-read-until
[ find-last-sep ] keep over [
- [ swap 1+ sbuf-read-until ] 2keep [ nth ] 2keep
+ [ swap 1+ growable-read-until ] 2keep [ nth ] 2keep
set-length
] [
- [ swap drop 0 sbuf-read-until f like f ] keep
+ [ swap drop 0 growable-read-until f like f ] keep
delete-all
] if ;
2drop f
] [
[ length swap - 0 max ] keep
- [ swap sbuf-read-until ] 2keep
+ [ swap growable-read-until ] 2keep
set-length
] if ;
: with-string-reader ( str quot -- )
>r <string-reader> r> with-stream ; inline
-
-: <byte-reader> ( byte-array encoding -- stream )
- >r >byte-vector dup reverse-here r> <decoding> ;
-
-: with-byte-reader ( byte-array encoding quot -- )
- >r <byte-reader> r> with-stream ; inline