| author | wenzelm | 
| Sat, 11 Jan 2025 21:58:47 +0100 | |
| changeset 81766 | ebf113cd6d2c | 
| parent 80822 | 4f54a509bc89 | 
| permissions | -rw-r--r-- | 
| 6316 | 1 | (* Title: Pure/General/buffer.ML | 
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 2 | Author: Makarius | 
| 6316 | 3 | |
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 4 | Scalable text buffers. | 
| 6316 | 5 | *) | 
| 6 | ||
| 7 | signature BUFFER = | |
| 8 | sig | |
| 9 | type T | |
| 10 | val empty: T | |
| 70601 
79831e40e2be
more scalable: avoid huge intermediate XML elems;
 wenzelm parents: 
70600diff
changeset | 11 | val is_empty: T -> bool | 
| 74231 | 12 | val add: string -> T -> T | 
| 75566 | 13 | val length: T -> int | 
| 14 | val contents: T -> string list | |
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 15 | val content: T -> string | 
| 74231 | 16 | val build: (T -> T) -> T | 
| 17 | val build_content: (T -> T) -> string | |
| 6316 | 18 | end; | 
| 19 | ||
| 20 | structure Buffer: BUFFER = | |
| 21 | struct | |
| 22 | ||
| 70998 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 23 | abstype T = Buffer of string list | 
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 24 | with | 
| 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 25 | |
| 70998 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 26 | val empty = Buffer []; | 
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 27 | |
| 70998 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 28 | fun is_empty (Buffer xs) = null xs; | 
| 6316 | 29 | |
| 70998 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 30 | fun add "" buf = buf | 
| 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 31 | | add x (Buffer xs) = Buffer (x :: xs); | 
| 17062 | 32 | |
| 75566 | 33 | fun length (Buffer xs) = fold (Integer.add o size) xs 0; | 
| 34 | ||
| 35 | fun contents (Buffer xs) = rev xs; | |
| 36 | val content = implode o contents; | |
| 70998 
7926d2fc3c4c
back to more elementary Buffer.T -- less intermediate garbage;
 wenzelm parents: 
70601diff
changeset | 37 | |
| 74231 | 38 | fun build (f: T -> T) = f empty; | 
| 39 | fun build_content f = build f |> content; | |
| 40 | ||
| 70600 
6e97e31933a6
more scalable buffer: produce compact chunks on the fly, avoid too many small particles that might congest heap management;
 wenzelm parents: 
68228diff
changeset | 41 | end; | 
| 17062 | 42 | |
| 6316 | 43 | end; |