| author | wenzelm | 
| Tue, 04 Oct 2016 19:38:43 +0200 | |
| changeset 64042 | 6957bd29a950 | 
| parent 60982 | 67e389f67073 | 
| child 68228 | 326f4bcc5abc | 
| permissions | -rw-r--r-- | 
| 6316 | 1  | 
(* Title: Pure/General/buffer.ML  | 
2  | 
Author: Markus Wenzel, TU Muenchen  | 
|
3  | 
||
| 26502 | 4  | 
Efficient text buffers.  | 
| 6316 | 5  | 
*)  | 
6  | 
||
7  | 
signature BUFFER =  | 
|
8  | 
sig  | 
|
9  | 
type T  | 
|
10  | 
val empty: T  | 
|
11  | 
val add: string -> T -> T  | 
|
| 23785 | 12  | 
val markup: Markup.T -> (T -> T) -> T -> T  | 
| 6316 | 13  | 
val content: T -> string  | 
| 
60982
 
67e389f67073
precise BinIO, without newline conversion on Windows;
 
wenzelm 
parents: 
29323 
diff
changeset
 | 
14  | 
val output: T -> BinIO.outstream -> unit  | 
| 6316 | 15  | 
end;  | 
16  | 
||
17  | 
structure Buffer: BUFFER =  | 
|
18  | 
struct  | 
|
19  | 
||
| 29323 | 20  | 
datatype T = Buffer of string list;  | 
| 6316 | 21  | 
|
| 29323 | 22  | 
val empty = Buffer [];  | 
| 17062 | 23  | 
|
| 29323 | 24  | 
fun add "" buf = buf  | 
25  | 
| add x (Buffer xs) = Buffer (x :: xs);  | 
|
| 17062 | 26  | 
|
| 23785 | 27  | 
fun markup m body =  | 
28  | 
let val (bg, en) = Markup.output m  | 
|
29  | 
in add bg #> body #> add en end;  | 
|
30  | 
||
| 29323 | 31  | 
fun content (Buffer xs) = implode (rev xs);  | 
| 
60982
 
67e389f67073
precise BinIO, without newline conversion on Windows;
 
wenzelm 
parents: 
29323 
diff
changeset
 | 
32  | 
|
| 
 
67e389f67073
precise BinIO, without newline conversion on Windows;
 
wenzelm 
parents: 
29323 
diff
changeset
 | 
33  | 
fun output (Buffer xs) stream =  | 
| 
 
67e389f67073
precise BinIO, without newline conversion on Windows;
 
wenzelm 
parents: 
29323 
diff
changeset
 | 
34  | 
List.app (fn s => BinIO.output (stream, Byte.stringToBytes s)) (rev xs);  | 
| 26502 | 35  | 
|
| 6316 | 36  | 
end;  |