// $Id$ //$module Stream : IStream; $use Access Apply Arithm Box Class Compare StdIO; //** $func Stream s.func e.args = stream; Stream s.func e.args, { # = $error "refal.plus.Stream.Stream" "Invalid argument" 1 "Not a function" s.func; ; }; $func? Read_Expr s.box = v.expr; Read_Expr s.box = : v.expr, , v.expr; //** $func Expr-Open expr = stream; Expr_Open expr = :: s.box, ; //** $func File-Open e.filename = stream; //** $func File-Close stream = ; File_Open e.filename = :: s.channel, , ; File_Close stream, { : (e.buf) (s.func e.args), { e.args : s.ch e.rest, = ; $error "refal.plus.Stream.File_Close" "Invalid argument" 1 "Not a streamed file"; }; $error "refal.plus.Stream.File_Close" "Invalid argument" 1 "Not a stream" stream; }; //** $func StdIStream = stream; $box StdIStream_Box; StdIStream, { : stream = stream; :: stream, , stream; }; //** $func? Getc stream = term; Getc stream, { : (e.buf) (s.func e.args) = e.buf $iter { ; = $fail; } :: e.buf, e.buf : t.head e.tail = , t.head; $error "refal.plus.Stream.Getc" "Invalid argument" 1 "Not a stream" stream; }; //** $func? Gets stream s.n = expr; Gets stream s.n, { : (e.buf) (s.func e.args) = e.buf $iter { e.buf ; = $fail; } :: e.buf, ) (s.func e.args)>, ; $error "refal.plus.Stream.Gets" "Invalid argument" 1 "Not a stream" stream; }; //** $func Ungets stream expr = ; Ungets stream expr, { : (e.buf) (s.func e.args) = ; $error "refal.plus.Stream.Ungets" "Invalid argument" 1 "Not a stream" stream; }; //** $func Scanc stream t1 = empty-or-t1; Scanc stream t1, { : { t1 = t1; t2 = ; }; /*empty*/; }; Scans stream e1, { > : { e1 = e1; e2 = ; }; /*empty*/; }; //** $func Get-Delim stream t.delim = expr; Get_Delims stream v.delim, 1> :: s.delimLength, { : (e.buf) (s.func e.args) = (/*e.str*/) (e.buf) $iter { e.buf : e1 v.delim e2 = (e.str e1 v.delim) (e2) Stop; :: e.newBuf = { (e.str ) ( e.newBuf); (e.str) (e.buf e.newBuf); }; (e.str e.buf) () Stop; } :: (e.str) (e.buf) e.isStop, e.isStop : v = , e.str; $error "refal.plus.Stream.Get_Delims" "Invalid argument" 1 "Not a stream" stream; }; //** $func Get-Delim stream t.delim = expr; Get_Delim stream t.delim, { : (e.buf) (s.func e.args) = (/*e.str*/) (e.buf) $iter { e.buf : e1 t.delim e2 = (e.str e1 t.delim) (e2) Stop; (e.str e.buf) (); (e.str e.buf) () Stop; } :: (e.str) (e.buf) e.isStop, e.isStop : v = , e.str; $error "refal.plus.Stream.Get_Delim" "Invalid argument" 1 "Not a stream" stream; }; //** $func Get-Line stream = expr; //Get-Line stream = ; $func? Not_EOL t1 = ; Not_EOL t1 = # t1 : \{ '\n'; '\r'; }; Get_Line stream = ; //** $func Get-While stream s.pred = expr; Get_While stream s.pred e.predArgs, { : (e.buf) (s.func e.args) = (/*e.str*/) (e.buf) $iter { e.buf : e.head t1 e.tail, # \{ : e; } = (e.str e.head) (t1 e.tail) Stop; (e.str e.buf) (); (e.str e.buf) () Stop; } :: (e.str) (e.buf) e.isStop, e.isStop : v = , e.str; $error "refal.plus.Stream.Get_While" "Invalid argument" 1 "Not a stream" stream; }; Get_Until stream s.pred e.predArgs, { : (e.buf) (s.func e.args) = (/*e.str*/) (e.buf) $iter { e.buf : e.head t1 e.tail, : e = (e.str e.head) (t1 e.tail) Stop; (e.str e.buf) (); (e.str e.buf) () Stop; } :: (e.str) (e.buf) e.isStop, e.isStop : v = , e.str; $error "refal.plus.Stream.Get_Until" "Invalid argument" 1 "Not a stream" stream; }; //** $func? End-of-Stream? stream = ; IsEnd_of_Stream stream, { : (e.buf) (s.func e.args) = { e.buf $iter :: e.buf, e.buf : v = , $fail; /*We are at the end of the stream*/; }; $error "refal.plus.Stream.IsEnd_of_Stream" "Invalid argument" 1 "Not a stream" stream; };