1 ! Copyright (C) 2005 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: kernel continuations io ;
6 ! We ensure that the stream can only be closed once, to preserve
7 ! integrity of duplex I/O ports.
9 TUPLE: duplex-stream in out closed? ;
11 : <duplex-stream> ( in out -- stream )
12 f duplex-stream construct-boa ;
16 : check-closed ( stream -- )
18 [ \ check-closed construct-boa throw ] when ;
20 : duplex-stream-in+ ( duplex -- stream )
21 dup check-closed duplex-stream-in ;
23 : duplex-stream-out+ ( duplex -- stream )
24 dup check-closed duplex-stream-out ;
26 M: duplex-stream stream-flush
27 duplex-stream-out+ stream-flush ;
29 M: duplex-stream stream-readln
30 duplex-stream-in+ stream-readln ;
32 M: duplex-stream stream-read1
33 duplex-stream-in+ stream-read1 ;
35 M: duplex-stream stream-read-until
36 duplex-stream-in+ stream-read-until ;
38 M: duplex-stream stream-read-partial
39 duplex-stream-in+ stream-read-partial ;
41 M: duplex-stream stream-read
42 duplex-stream-in+ stream-read ;
44 M: duplex-stream stream-write1
45 duplex-stream-out+ stream-write1 ;
47 M: duplex-stream stream-write
48 duplex-stream-out+ stream-write ;
50 M: duplex-stream stream-nl
51 duplex-stream-out+ stream-nl ;
53 M: duplex-stream stream-format
54 duplex-stream-out+ stream-format ;
56 M: duplex-stream make-span-stream
57 duplex-stream-out+ make-span-stream ;
59 M: duplex-stream make-block-stream
60 duplex-stream-out+ make-block-stream ;
62 M: duplex-stream make-cell-stream
63 duplex-stream-out+ make-cell-stream ;
65 M: duplex-stream stream-write-table
66 duplex-stream-out+ stream-write-table ;
68 M: duplex-stream stream-close
69 #! The output stream is closed first, in case both streams
70 #! are attached to the same file descriptor, the output
71 #! buffer needs to be flushed before we close the fd.
72 dup duplex-stream-closed? [
73 t over set-duplex-stream-closed?
74 [ dup duplex-stream-out stream-close ]
75 [ dup duplex-stream-in stream-close ] [ ] cleanup
78 M: duplex-stream set-timeout
80 duplex-stream-in set-timeout
81 duplex-stream-out set-timeout ;