| author | wenzelm | 
| Sat, 18 Mar 2017 20:35:58 +0100 | |
| changeset 65312 | 34d56ca5b548 | 
| 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: 
29323diff
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: 
29323diff
changeset | 32 | |
| 
67e389f67073
precise BinIO, without newline conversion on Windows;
 wenzelm parents: 
29323diff
changeset | 33 | fun output (Buffer xs) stream = | 
| 
67e389f67073
precise BinIO, without newline conversion on Windows;
 wenzelm parents: 
29323diff
changeset | 34 | List.app (fn s => BinIO.output (stream, Byte.stringToBytes s)) (rev xs); | 
| 26502 | 35 | |
| 6316 | 36 | end; |