src/Pure/General/buffer.ML
author wenzelm
Sun, 01 Mar 2009 23:36:12 +0100
changeset 30190 479806475f3c
parent 29323 868634981a32
child 60982 67e389f67073
permissions -rw-r--r--
use long names for old-style fold combinators;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/buffer.ML
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     2
    Author:     Markus Wenzel, TU Muenchen
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     3
26502
7f64d8cf6707 added add_substring;
wenzelm
parents: 23785
diff changeset
     4
Efficient text buffers.
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     5
*)
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     6
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     7
signature BUFFER =
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     8
sig
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
     9
  type T
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    10
  val empty: T
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    11
  val add: string -> T -> T
23785
ea7c2ee8a47a added markup operation;
wenzelm
parents: 23226
diff changeset
    12
  val markup: Markup.T -> (T -> T) -> T -> T
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    13
  val content: T -> string
26545
6e1aef001b3b output: canonical argument order (as opposed to write);
wenzelm
parents: 26502
diff changeset
    14
  val output: T -> TextIO.outstream -> unit
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    15
end;
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    16
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    17
structure Buffer: BUFFER =
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    18
struct
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    19
29323
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    20
datatype T = Buffer of string list;
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    21
29323
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    22
val empty = Buffer [];
17062
7272b45099c7 tuned Buffer.add;
wenzelm
parents: 16712
diff changeset
    23
29323
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    24
fun add "" buf = buf
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    25
  | add x (Buffer xs) = Buffer (x :: xs);
17062
7272b45099c7 tuned Buffer.add;
wenzelm
parents: 16712
diff changeset
    26
23785
ea7c2ee8a47a added markup operation;
wenzelm
parents: 23226
diff changeset
    27
fun markup m body =
ea7c2ee8a47a added markup operation;
wenzelm
parents: 23226
diff changeset
    28
  let val (bg, en) = Markup.output m
ea7c2ee8a47a added markup operation;
wenzelm
parents: 23226
diff changeset
    29
  in add bg #> body #> add en end;
ea7c2ee8a47a added markup operation;
wenzelm
parents: 23226
diff changeset
    30
29323
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    31
fun content (Buffer xs) = implode (rev xs);
868634981a32 removed unused add_substring;
wenzelm
parents: 28027
diff changeset
    32
fun output (Buffer xs) stream = List.app (fn s => TextIO.output (stream, s)) (rev xs);
26502
7f64d8cf6707 added add_substring;
wenzelm
parents: 23785
diff changeset
    33
6316
4a786a8a1a97 simple string buffers;
wenzelm
parents:
diff changeset
    34
end;