| author | wenzelm | 
| Mon, 29 Dec 2008 18:27:33 +0100 | |
| changeset 29200 | 787ba47201c7 | 
| parent 27732 | 8dbf5761a24a | 
| child 29606 | fedb8be05f24 | 
| permissions | -rw-r--r-- | 
| 6118 | 1 | (* Title: Pure/General/source.ML | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 3 | Author: Markus Wenzel, TU Muenchen | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 4 | |
| 8806 | 5 | Coalgebraic data sources -- efficient purely functional input streams. | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 6 | *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 7 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 8 | signature SOURCE = | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 9 | sig | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 10 |   type ('a, 'b) source
 | 
| 6681 | 11 | val default_prompt: string | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 12 |   val set_prompt: string -> ('a, 'b) source -> ('a, 'b) source
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 13 |   val get: ('a, 'b) source -> 'a list * ('a, 'b) source
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 14 |   val unget: 'a list * ('a, 'b) source -> ('a, 'b) source
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 15 |   val get_single: ('a, 'b) source -> ('a * ('a, 'b) source) option
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 16 |   val exhaust: ('a, 'b) source -> 'a list
 | 
| 19485 | 17 |   val map_filter: ('a -> 'b option) -> ('a, 'c) source -> ('b, ('a, 'c) source) source
 | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 18 |   val filter: ('a -> bool) -> ('a, 'b) source -> ('a, ('a, 'b) source) source
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 19 |   val of_list: 'a list -> ('a, 'a list) source
 | 
| 24064 | 20 |   val of_list_limited: int -> 'a list -> ('a, 'a list) source
 | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 21 | val of_string: string -> (string, string list) source | 
| 9123 
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
 wenzelm parents: 
8806diff
changeset | 22 |   val exhausted: ('a, 'b) source -> ('a, 'a list) source
 | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 23 | val tty: (string, unit) source | 
| 27732 | 24 |   val source': 'a -> 'b Scan.stopper -> ('a * 'b list -> 'c list * ('a * 'b list)) ->
 | 
| 23682 
cf4773532006
nested source: explicit interactive flag for recover avoids duplicate errors;
 wenzelm parents: 
23675diff
changeset | 25 |     (bool * (string -> 'a * 'b list -> 'c list * ('a * 'b list))) option ->
 | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 26 |     ('b, 'e) source -> ('c, 'a * ('b, 'e) source) source
 | 
| 27732 | 27 |   val source: 'a Scan.stopper -> ('a list -> 'b list * 'a list) ->
 | 
| 23682 
cf4773532006
nested source: explicit interactive flag for recover avoids duplicate errors;
 wenzelm parents: 
23675diff
changeset | 28 | (bool * (string -> 'a list -> 'b list * 'a list)) option -> | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 29 |     ('a, 'd) source -> ('b, ('a, 'd) source) source
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 30 | end; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 31 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 32 | structure Source: SOURCE = | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 33 | struct | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 34 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 35 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 36 | (** datatype source **) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 37 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 38 | datatype ('a, 'b) source =
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 39 | Source of | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 40 |    {buffer: 'a list,
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 41 | info: 'b, | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 42 | prompt: string, | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 43 | drain: string -> 'b -> 'a list * 'b}; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 44 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 45 | fun make_source buffer info prompt drain = | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 46 |   Source {buffer = buffer, info = info, prompt = prompt, drain = drain};
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 47 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 48 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 49 | (* prompt *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 50 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 51 | val default_prompt = "> "; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 52 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 53 | fun set_prompt prompt (Source {buffer, info, prompt = _, drain}) =
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 54 | make_source buffer info prompt drain; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 55 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 56 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 57 | (* get / unget *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 58 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 59 | fun get (Source {buffer = [], info, prompt, drain}) =
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 60 | let val (xs, info') = drain prompt info | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 61 | in (xs, make_source [] info' prompt drain) end | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 62 |   | get (Source {buffer, info, prompt, drain}) =
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 63 | (buffer, make_source [] info prompt drain); | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 64 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 65 | fun unget (xs, Source {buffer, info, prompt, drain}) =
 | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 66 | make_source (xs @ buffer) info prompt drain; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 67 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 68 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 69 | (* variations on get *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 70 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 71 | fun get_prompt prompt src = get (set_prompt prompt src); | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 72 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 73 | fun get_single src = | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 74 | (case get src of | 
| 15531 | 75 | ([], _) => NONE | 
| 76 | | (x :: xs, src') => SOME (x, unget (xs, src'))); | |
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 77 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 78 | fun exhaust src = | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 79 | (case get src of | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 80 | ([], _) => [] | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 81 | | (xs, src') => xs @ exhaust src'); | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 82 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 83 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 84 | (* (map)filter *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 85 | |
| 19485 | 86 | fun drain_map_filter f prompt src = | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 87 | let | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 88 | val (xs, src') = get_prompt prompt src; | 
| 19485 | 89 | val xs' = map_filter f xs; | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 90 | in | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 91 | if null xs orelse not (null xs') then (xs', src') | 
| 19485 | 92 | else drain_map_filter f prompt src' | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 93 | end; | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 94 | |
| 19485 | 95 | fun map_filter f src = make_source [] src default_prompt (drain_map_filter f); | 
| 96 | fun filter pred = map_filter (fn x => if pred x then SOME x else NONE); | |
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 97 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 98 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 99 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 100 | (** build sources **) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 101 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 102 | (* list source *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 103 | |
| 14727 
ab06e87e5c83
Source.of_list: no buffer limitation (now pointless due to tail-recursive Scan.repeat);
 wenzelm parents: 
10746diff
changeset | 104 | fun of_list xs = make_source [] xs default_prompt (fn _ => fn xs => (xs, [])); | 
| 24064 | 105 | fun of_list_limited n xs = make_source [] xs default_prompt (fn _ => chop n); | 
| 6181 | 106 | |
| 24064 | 107 | val of_string = of_list o explode; | 
| 23875 
e22705ccc07d
added of_string_limited (more efficient for partial scans);
 wenzelm parents: 
23700diff
changeset | 108 | |
| 9123 
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
 wenzelm parents: 
8806diff
changeset | 109 | fun exhausted src = of_list (exhaust src); | 
| 
f8f54877a18c
added exhausted: ('a, 'b) source -> ('a, 'a list) source;
 wenzelm parents: 
8806diff
changeset | 110 | |
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 111 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 112 | (* stream source *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 113 | |
| 24232 
a70360a54e5c
stream source: non-critical, assuming exclusive ownership;
 wenzelm parents: 
24064diff
changeset | 114 | fun slurp_input instream = | 
| 20737 | 115 | let | 
| 116 | fun slurp () = | |
| 117 | (case TextIO.canInput (instream, 1) handle IO.Io _ => NONE of | |
| 118 | NONE => [] | |
| 119 | | SOME 0 => [] | |
| 120 | | SOME _ => TextIO.input instream :: slurp ()); | |
| 24232 
a70360a54e5c
stream source: non-critical, assuming exclusive ownership;
 wenzelm parents: 
24064diff
changeset | 121 | in maps explode (slurp ()) end; | 
| 20737 | 122 | |
| 25846 | 123 | val tty = make_source [] () default_prompt (fn prompt => fn () => | 
| 124 | let val input = slurp_input TextIO.stdIn in | |
| 20737 | 125 | if exists (fn c => c = "\n") input then (input, ()) | 
| 126 | else | |
| 25846 | 127 | (case (Output.prompt prompt; TextIO.inputLine TextIO.stdIn) of | 
| 25575 | 128 | SOME line => (input @ explode line, ()) | 
| 129 | | NONE => (input, ())) | |
| 25846 | 130 | end); | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 131 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 132 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 133 | |
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 134 | (** cascade sources **) | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 135 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 136 | (* state-based *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 137 | |
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 138 | fun drain_source' stopper scan opt_recover prompt (state, src) = | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 139 | let | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 140 | val drain = Scan.drain prompt get_prompt stopper; | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 141 | val (xs, s) = get_prompt prompt src; | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 142 | val inp = ((state, xs), s); | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 143 | val ((ys, (state', xs')), src') = | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 144 | if null xs then (([], (state, [])), s) | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 145 | else | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 146 | (case opt_recover of | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 147 | NONE => drain (Scan.error scan) inp | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 148 | | SOME (interactive, recover) => | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 149 | (drain (Scan.catch scan) inp handle Fail msg => | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 150 | (if interactive then Output.error_msg msg else (); | 
| 27732 | 151 | drain (Scan.unless (Scan.lift (Scan.one (Scan.is_stopper stopper))) (recover msg)) inp))); | 
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 152 | in (ys, (state', unget (xs', src'))) end; | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 153 | |
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 154 | fun source' init_state stopper scan recover src = | 
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 155 | make_source [] (init_state, src) default_prompt (drain_source' stopper scan recover); | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 156 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 157 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 158 | (* non state-based *) | 
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 159 | |
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 160 | fun drain_source stopper scan opt_recover prompt = | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 161 | Scan.unlift (drain_source' stopper (Scan.lift scan) | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 162 | (Option.map (fn (int, r) => (int, Scan.lift o r)) opt_recover) prompt); | 
| 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 163 | |
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 164 | fun source stopper scan recover src = | 
| 23700 
fb1102e98cd4
moved source cascading from scan.ML to source.ML;
 wenzelm parents: 
23682diff
changeset | 165 | make_source [] src default_prompt (drain_source stopper scan recover); | 
| 6116 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 166 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 167 | |
| 
8ba2f25610f7
files scan.ML, source.ML, symbol.ML, pretty.ML moved to Pure/General;
 wenzelm parents: diff
changeset | 168 | end; |