1 ! Copyright (C) 2009 Daniel Ehrenberg
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: sequences io io.streams.plain kernel accessors math math.order
4 growable destructors combinators ;
5 IN: io.streams.sequence
11 : >sequence-stream< ( stream -- i underlying )
12 [ i>> ] [ underlying>> ] bi ; inline
15 [ 1 + ] change-i drop ; inline
17 : sequence-read1 ( stream -- elt/f )
18 [ >sequence-stream< ?nth ] [ next ] bi ; inline
20 : add-length ( n stream -- i+n )
21 [ i>> + ] [ underlying>> length ] bi min ; inline
23 : (sequence-read) ( n stream -- seq/f )
25 [ [ swap dup ] change-i drop ]
29 : sequence-read ( n stream -- seq/f )
30 dup >sequence-stream< bounds-check?
31 [ (sequence-read) ] [ 2drop f ] if ; inline
33 : find-sep ( seps stream -- sep/f n )
34 swap [ >sequence-stream< swap tail-slice ] dip
35 [ member-eq? ] curry find swap ; inline
37 : sequence-read-until ( separators stream -- seq sep/f )
39 [ sequence-read ] [ next ] bi swap ; inline
42 M: growable dispose drop ;
44 M: growable stream-write1 push ;
45 M: growable stream-write push-all ;
46 M: growable stream-flush drop ;
48 INSTANCE: growable plain-writer
51 : (stream-seek) ( n seek-type stream -- )
53 { seek-absolute [ i<< ] }
54 { seek-relative [ [ + ] change-i drop ] }
55 { seek-end [ [ underlying>> length + ] [ i<< ] bi ] }