1 ! Copyright (C) 2003, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors io kernel math namespaces sequences sbufs
4 strings generic splitting continuations destructors
5 io.streams.plain io.encodings math.order growable ;
8 M: growable dispose drop ;
10 M: growable stream-write1 push ;
11 M: growable stream-write push-all ;
12 M: growable stream-flush drop ;
14 : <string-writer> ( -- stream )
17 : with-string-writer ( quot -- str )
18 <string-writer> swap [ output-stream get ] compose with-output-stream*
21 M: growable stream-read1 [ f ] [ pop ] if-empty ;
23 : harden-as ( seq growble-exemplar -- newseq )
26 : growable-read-until ( growable n -- str )
27 >fixnum dupd tail-slice swap harden-as dup reverse-here ;
29 : find-last-sep ( seq seps -- n )
30 swap [ memq? ] curry find-last drop ;
32 M: growable stream-read-until
33 [ find-last-sep ] keep over [
34 [ swap 1+ growable-read-until ] 2keep [ nth ] 2keep
37 [ swap drop 0 growable-read-until f like f ] keep
41 M: growable stream-read
45 [ length swap - 0 max ] keep
46 [ swap growable-read-until ] 2keep
50 M: growable stream-read-partial
54 M: null decode-char drop stream-read1 ;
56 : <string-reader> ( str -- stream )
57 >sbuf dup reverse-here null <decoder> ;
59 : with-string-reader ( str quot -- )
60 >r <string-reader> r> with-input-stream ; inline
62 INSTANCE: growable plain-writer
64 : format-column ( seq ? -- seq )
66 [ 0 [ length max ] reduce ] keep
67 swap [ CHAR: \s pad-right ] curry map
70 : map-last ( seq quot -- seq )
71 >r dup length <reversed> [ zero? ] r> compose 2map ; inline
73 : format-table ( table -- seq )
74 flip [ format-column ] map-last
75 flip [ " " join ] map ;
77 M: plain-writer stream-write-table
78 [ drop format-table [ print ] each ] with-output-stream* ;
80 M: plain-writer make-cell-stream 2drop <string-writer> ;