]> gitweb.factorcode.org Git - factor.git/blob - core/io/streams/duplex/duplex.factor
Initial import
[factor.git] / core / io / streams / duplex / duplex.factor
1 ! Copyright (C) 2005 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: io.streams.duplex
4 USING: kernel continuations io ;
5
6 ! We ensure that the stream can only be closed once, to preserve
7 ! integrity of duplex I/O ports.
8
9 TUPLE: duplex-stream in out closed? ;
10
11 : <duplex-stream> ( in out -- stream )
12     f duplex-stream construct-boa ;
13
14 TUPLE: check-closed ;
15
16 : check-closed ( stream -- )
17     duplex-stream-closed?
18     [ \ check-closed construct-boa throw ] when ;
19
20 : duplex-stream-in+ ( duplex -- stream )
21     dup check-closed duplex-stream-in ;
22
23 : duplex-stream-out+ ( duplex -- stream )
24     dup check-closed duplex-stream-out ;
25
26 M: duplex-stream stream-flush
27     duplex-stream-out+ stream-flush ;
28
29 M: duplex-stream stream-readln
30     duplex-stream-in+ stream-readln ;
31
32 M: duplex-stream stream-read1
33     duplex-stream-in+ stream-read1 ;
34
35 M: duplex-stream stream-read-until
36     duplex-stream-in+ stream-read-until ;
37
38 M: duplex-stream stream-read-partial
39     duplex-stream-in+ stream-read-partial ;
40
41 M: duplex-stream stream-read
42     duplex-stream-in+ stream-read ;
43
44 M: duplex-stream stream-write1
45     duplex-stream-out+ stream-write1 ;
46
47 M: duplex-stream stream-write
48     duplex-stream-out+ stream-write ;
49
50 M: duplex-stream stream-nl
51     duplex-stream-out+ stream-nl ;
52
53 M: duplex-stream stream-format
54     duplex-stream-out+ stream-format ;
55
56 M: duplex-stream make-span-stream
57     duplex-stream-out+ make-span-stream ;
58
59 M: duplex-stream make-block-stream
60     duplex-stream-out+ make-block-stream ;
61
62 M: duplex-stream make-cell-stream
63     duplex-stream-out+ make-cell-stream ;
64
65 M: duplex-stream stream-write-table
66     duplex-stream-out+ stream-write-table ;
67
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
76     ] unless drop ;
77
78 M: duplex-stream set-timeout
79     2dup
80     duplex-stream-in set-timeout
81     duplex-stream-out set-timeout ;