| author | krauss | 
| Tue, 07 Nov 2006 09:33:47 +0100 | |
| changeset 21199 | 2d83f93c3580 | 
| parent 20594 | b80c4a5cd018 | 
| child 21395 | f34ac19659ae | 
| permissions | -rw-r--r-- | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 1 | (* Title: HOL/Import/lazy_seq.ML | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 3 | Author: Sebastian Skalberg, TU Muenchen | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 4 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 5 | Alternative version of lazy sequences. | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 6 | *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 7 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 8 | signature LAZY_SEQ = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 9 | sig | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 10 | |
| 19089 | 11 | include EXTENDED_SCANNER_SEQ | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 12 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 13 | (* From LIST *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 14 | |
| 19089 | 15 | val fromString : string -> string seq | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 16 | val @ : 'a seq * 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 17 | val hd : 'a seq -> 'a | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 18 | val tl : 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 19 | val last : 'a seq -> 'a | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 20 |     val getItem : 'a seq -> ('a * 'a seq) option
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 21 | val nth : 'a seq * int -> 'a | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 22 | val take : 'a seq * int -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 23 | val drop : 'a seq * int -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 24 | val rev : 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 25 | val concat : 'a seq seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 26 | val revAppend : 'a seq * 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 27 |     val app : ('a -> unit) -> 'a seq -> unit
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 28 |     val map : ('a -> 'b) -> 'a seq -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 29 |     val mapPartial : ('a -> 'b option) -> 'a seq -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 30 |     val find : ('a -> bool) -> 'a seq -> 'a option
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 31 |     val filter : ('a -> bool) -> 'a seq -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 32 |     val partition : ('a -> bool)
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 33 | -> 'a seq -> 'a seq * 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 34 |     val foldl : ('a * 'b -> 'b) -> 'b -> 'a seq -> 'b
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 35 |     val foldr : ('a * 'b -> 'b) -> 'b -> 'a seq -> 'b
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 36 |     val exists : ('a -> bool) -> 'a seq -> bool
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 37 |     val all : ('a -> bool) -> 'a seq -> bool
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 38 | val tabulate : int * (int -> 'a) -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 39 |     val collate : ('a * 'a -> order)
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 40 | -> 'a seq * 'a seq -> order | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 41 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 42 | (* Miscellaneous *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 43 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 44 | val cycle : ((unit ->'a seq) -> 'a seq) -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 45 |     val iterates   : ('a -> 'a) -> 'a -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 46 | val of_function: (unit -> 'a option) -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 47 | val of_string : string -> char seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 48 | val of_instream: TextIO.instream -> char seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 49 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 50 | (* From SEQ *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 51 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 52 |     val make: (unit -> ('a * 'a seq) option) -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 53 | val empty: 'a -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 54 | val cons: 'a * 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 55 | val single: 'a -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 56 |     val try: ('a -> 'b) -> 'a -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 57 | val chop: int * 'a seq -> 'a list * 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 58 | val list_of: 'a seq -> 'a list | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 59 | val of_list: 'a list -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 60 |     val mapp: ('a -> 'b) -> 'a seq -> 'b seq -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 61 | val interleave: 'a seq * 'a seq -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 62 | val print: (int -> 'a -> unit) -> int -> 'a seq -> unit | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 63 |     val it_right : ('a * 'b seq -> 'b seq) -> 'a seq * 'b seq -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 64 | val commute: 'a seq list -> 'a list seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 65 | val succeed: 'a -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 66 | val fail: 'a -> 'b seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 67 |     val THEN: ('a -> 'b seq) * ('b -> 'c seq) -> 'a -> 'c seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 68 |     val ORELSE: ('a -> 'b seq) * ('a -> 'b seq) -> 'a -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 69 |     val APPEND: ('a -> 'b seq) * ('a -> 'b seq) -> 'a -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 70 |     val EVERY: ('a -> 'a seq) list -> 'a -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 71 |     val FIRST: ('a -> 'b seq) list -> 'a -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 72 |     val TRY: ('a -> 'a seq) -> 'a -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 73 |     val REPEAT: ('a -> 'a seq) -> 'a -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 74 |     val REPEAT1: ('a -> 'a seq) -> 'a -> 'a seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 75 | val INTERVAL: (int -> 'a -> 'a seq) -> int -> int -> 'a -> 'a seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 76 |     val DETERM: ('a -> 'b seq) -> 'a -> 'b seq
 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 77 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 78 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 79 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 80 | structure LazySeq :> LAZY_SEQ = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 81 | struct | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 82 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 83 | open Susp | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 84 | |
| 20594 | 85 | datatype 'a seq = Seq of ('a * 'a seq) option Susp.T
 | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 86 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 87 | exception Empty | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 88 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 89 | fun getItem (Seq s) = force s | 
| 19089 | 90 | val pull = getItem | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 91 | fun make f = Seq (delay f) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 92 | |
| 19064 | 93 | fun null s = is_none (getItem s) | 
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 94 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 95 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 96 | fun F n NONE = n | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 97 | | F n (SOME(_,s)) = F (n+1) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 98 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 99 | fun length s = F 0 (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 100 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 101 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 102 | fun s1 @ s2 = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 103 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 104 | fun F NONE = getItem s2 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 105 | | F (SOME(x,s1')) = SOME(x,F' s1') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 106 | and F' s = make (fn () => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 107 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 108 | F' s1 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 109 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 110 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 111 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 112 | fun F NONE = raise Empty | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 113 | | F (SOME arg) = arg | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 114 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 115 | fun hd s = #1 (F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 116 | fun tl s = #2 (F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 117 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 118 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 119 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 120 | fun F x NONE = x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 121 | | F _ (SOME(x,s)) = F x (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 122 | fun G NONE = raise Empty | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 123 | | G (SOME(x,s)) = F x (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 124 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 125 | fun last s = G (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 126 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 127 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 128 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 129 | fun F NONE _ = raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 130 | | F (SOME(x,_)) 0 = x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 131 | | F (SOME(_,s)) n = F (getItem s) (n-1) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 132 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 133 | fun nth(s,n) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 134 | if n < 0 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 135 | then raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 136 | else F (getItem s) n | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 137 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 138 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 139 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 140 | fun F NONE _ = raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 141 | | F (SOME(x,s)) n = SOME(x,F' s (n-1)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 142 | and F' s 0 = Seq (value NONE) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 143 | | F' s n = make (fn () => F (getItem s) n) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 144 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 145 | fun take (s,n) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 146 | if n < 0 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 147 | then raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 148 | else F' s n | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 149 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 150 | |
| 19089 | 151 | fun take_at_most s n = | 
| 19064 | 152 | if n <= 0 then [] else | 
| 153 | case getItem s of | |
| 154 | NONE => [] | |
| 19089 | 155 | | SOME (x,s') => x::(take_at_most s' (n-1)) | 
| 19064 | 156 | |
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 157 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 158 | fun F s 0 = s | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 159 | | F NONE _ = raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 160 | | F (SOME(_,s)) n = F (getItem s) (n-1) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 161 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 162 | fun drop (s,0) = s | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 163 | | drop (s,n) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 164 | if n < 0 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 165 | then raise Subscript | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 166 | else make (fn () => F (getItem s) n) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 167 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 168 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 169 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 170 | fun F s NONE = s | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 171 | | F s (SOME(x,s')) = F (SOME(x, Seq (value s))) (getItem s') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 172 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 173 | fun rev s = make (fn () => F NONE (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 174 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 175 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 176 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 177 | fun F s NONE = getItem s | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 178 | | F s (SOME(x,s')) = F (Seq (value (SOME(x,s)))) (getItem s') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 179 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 180 | fun revAppend (s1,s2) = make (fn () => F s2 (getItem s1)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 181 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 182 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 183 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 184 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 185 | | F (SOME(s1,s2)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 186 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 187 | fun G NONE = F (getItem s2) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 188 | | G (SOME(x,s)) = SOME(x,make (fn () => G (getItem s))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 189 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 190 | G (getItem s1) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 191 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 192 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 193 | fun concat s = make (fn () => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 194 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 195 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 196 | fun app f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 197 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 198 | fun F NONE = () | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 199 | | F (SOME(x,s)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 200 | (f x; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 201 | F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 202 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 203 | F o getItem | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 204 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 205 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 206 | fun map f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 207 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 208 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 209 | | F (SOME(x,s)) = SOME(f x,F' s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 210 | and F' s = make (fn() => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 211 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 212 | F' | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 213 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 214 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 215 | fun mapPartial f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 216 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 217 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 218 | | F (SOME(x,s)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 219 | (case f x of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 220 | SOME y => SOME(y,F' s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 221 | | NONE => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 222 | and F' s = make (fn()=> F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 223 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 224 | F' | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 225 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 226 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 227 | fun find P = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 228 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 229 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 230 | | F (SOME(x,s)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 231 | if P x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 232 | then SOME x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 233 | else F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 234 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 235 | F o getItem | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 236 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 237 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 238 | (*fun filter p = mapPartial (fn x => if p x then SOME x else NONE)*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 239 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 240 | fun filter P = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 241 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 242 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 243 | | F (SOME(x,s)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 244 | if P x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 245 | then SOME(x,F' s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 246 | else F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 247 | and F' s = make (fn () => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 248 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 249 | F' | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 250 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 251 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 252 | fun partition f s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 253 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 254 | val s' = map (fn x => (x,f x)) s | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 255 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 256 | (mapPartial (fn (x,true) => SOME x | _ => NONE) s', | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 257 | mapPartial (fn (x,false) => SOME x | _ => NONE) s') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 258 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 259 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 260 | fun exists P = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 261 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 262 | fun F NONE = false | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 263 | | F (SOME(x,s)) = P x orelse F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 264 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 265 | F o getItem | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 266 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 267 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 268 | fun all P = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 269 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 270 | fun F NONE = true | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 271 | | F (SOME(x,s)) = P x andalso F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 272 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 273 | F o getItem | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 274 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 275 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 276 | (*fun tabulate f = map f (iterates (fn x => x + 1) 0)*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 277 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 278 | fun tabulate (n,f) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 279 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 280 | fun F n = make (fn () => SOME(f n,F (n+1))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 281 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 282 | F n | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 283 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 284 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 285 | fun collate c (s1,s2) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 286 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 287 | fun F NONE _ = LESS | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 288 | | F _ NONE = GREATER | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 289 | | F (SOME(x,s1)) (SOME(y,s2)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 290 | (case c (x,y) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 291 | LESS => LESS | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 292 | | GREATER => GREATER | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 293 | | EQUAL => F' s1 s2) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 294 | and F' s1 s2 = F (getItem s1) (getItem s2) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 295 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 296 | F' s1 s2 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 297 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 298 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 299 | fun empty _ = Seq (value NONE) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 300 | fun single x = Seq(value (SOME(x,Seq (value NONE)))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 301 | fun cons a = Seq(value (SOME a)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 302 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 303 | fun cycle seqfn = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 304 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 305 | val knot = ref (Seq (value NONE)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 306 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 307 | knot := seqfn (fn () => !knot); | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 308 | !knot | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 309 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 310 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 311 | fun iterates f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 312 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 313 | fun F x = make (fn() => SOME(x,F (f x))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 314 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 315 | F | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 316 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 317 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 318 | fun interleave (s1,s2) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 319 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 320 | fun F NONE = getItem s2 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 321 | | F (SOME(x,s1')) = SOME(x,interleave(s2,s1')) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 322 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 323 | make (fn()=> F (getItem s1)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 324 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 325 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 326 | (* val force_all = app ignore *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 327 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 328 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 329 | fun F NONE = () | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 330 | | F (SOME(x,s)) = F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 331 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 332 | fun force_all s = F (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 333 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 334 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 335 | fun of_function f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 336 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 337 | fun F () = case f () of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 338 | SOME x => SOME(x,make F) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 339 | | NONE => NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 340 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 341 | make F | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 342 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 343 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 344 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 345 | fun F [] = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 346 | | F (x::xs) = SOME(x,F' xs) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 347 | and F' xs = make (fn () => F xs) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 348 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 349 | fun of_list xs = F' xs | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 350 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 351 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 352 | val of_string = of_list o String.explode | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 353 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 354 | fun of_instream is = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 355 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 356 | val buffer : char list ref = ref [] | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 357 | fun get_input () = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 358 | case !buffer of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 359 | (c::cs) => (buffer:=cs; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 360 | SOME c) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 361 | | [] => (case String.explode (TextIO.input is) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 362 | [] => NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 363 | | (c::cs) => (buffer := cs; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 364 | SOME c)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 365 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 366 | of_function get_input | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 367 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 368 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 369 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 370 | fun F k NONE = k [] | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 371 | | F k (SOME(x,s)) = F (fn xs => k (x::xs)) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 372 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 373 | fun list_of s = F (fn x => x) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 374 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 375 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 376 | (* Adapted from seq.ML *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 377 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 378 | val succeed = single | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 379 | fun fail _ = Seq (value NONE) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 380 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 381 | (* fun op THEN (f, g) x = flat (map g (f x)) *) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 382 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 383 | fun op THEN (f, g) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 384 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 385 | fun F NONE = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 386 | | F (SOME(x,xs)) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 387 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 388 | fun G NONE = F (getItem xs) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 389 | | G (SOME(y,ys)) = SOME(y,make (fn () => G (getItem ys))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 390 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 391 | G (getItem (g x)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 392 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 393 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 394 | fn x => make (fn () => F (getItem (f x))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 395 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 396 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 397 | fun op ORELSE (f, g) x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 398 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 399 | case getItem (f x) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 400 | NONE => getItem (g x) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 401 | | some => some) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 402 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 403 | fun op APPEND (f, g) x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 404 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 405 | fun copy s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 406 | case getItem s of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 407 | NONE => getItem (g x) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 408 | | SOME(x,xs) => SOME(x,make (fn () => copy xs)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 409 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 410 | make (fn () => copy (f x)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 411 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 412 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 413 | fun EVERY fs = foldr (op THEN) succeed fs | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 414 | fun FIRST fs = foldr (op ORELSE) fail fs | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 415 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 416 | fun TRY f x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 417 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 418 | case getItem (f x) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 419 | NONE => SOME(x,Seq (value NONE)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 420 | | some => some) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 421 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 422 | fun REPEAT f = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 423 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 424 | fun rep qs x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 425 | case getItem (f x) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 426 | NONE => SOME(x, make (fn () => repq qs)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 427 | | SOME (x', q) => rep (q :: qs) x' | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 428 | and repq [] = NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 429 | | repq (q :: qs) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 430 | case getItem q of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 431 | NONE => repq qs | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 432 | | SOME (x, q) => rep (q :: qs) x | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 433 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 434 | fn x => make (fn () => rep [] x) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 435 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 436 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 437 | fun REPEAT1 f = op THEN (f, REPEAT f); | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 438 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 439 | fun INTERVAL f i = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 440 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 441 | fun F j = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 442 | if i > j | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 443 | then single | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 444 | else op THEN (f j, F (j - 1)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 445 | in F end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 446 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 447 | fun DETERM f x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 448 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 449 | case getItem (f x) of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 450 | NONE => NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 451 | | SOME (x', _) => SOME(x',Seq (value NONE))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 452 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 453 | (*partial function as procedure*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 454 | fun try f x = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 455 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 456 | case Library.try f x of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 457 | SOME y => SOME(y,Seq (value NONE)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 458 | | NONE => NONE) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 459 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 460 | (*functional to print a sequence, up to "count" elements; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 461 | the function prelem should print the element number and also the element*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 462 | fun print prelem count seq = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 463 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 464 | fun pr k xq = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 465 | if k > count | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 466 | then () | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 467 | else | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 468 | case getItem xq of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 469 | NONE => () | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 470 | | SOME (x, xq') => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 471 | (prelem k x; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 472 | writeln ""; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 473 | pr (k + 1) xq') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 474 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 475 | pr 1 seq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 476 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 477 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 478 | (*accumulating a function over a sequence; this is lazy*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 479 | fun it_right f (xq, yq) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 480 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 481 | fun its s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 482 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 483 | case getItem s of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 484 | NONE => getItem yq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 485 | | SOME (a, s') => getItem(f (a, its s'))) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 486 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 487 | its xq | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 488 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 489 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 490 | (*map over a sequence s1, append the sequence s2*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 491 | fun mapp f s1 s2 = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 492 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 493 | fun F NONE = getItem s2 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 494 | | F (SOME(x,s1')) = SOME(f x,F' s1') | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 495 | and F' s = make (fn () => F (getItem s)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 496 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 497 | F' s1 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 498 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 499 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 500 | (*turn a list of sequences into a sequence of lists*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 501 | local | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 502 | fun F [] = SOME([],Seq (value NONE)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 503 | | F (xq :: xqs) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 504 | case getItem xq of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 505 | NONE => NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 506 | | SOME (x, xq') => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 507 | (case F xqs of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 508 | NONE => NONE | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 509 | | SOME (xs, xsq) => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 510 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 511 | fun G s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 512 | make (fn () => | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 513 | case getItem s of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 514 | NONE => F (xq' :: xqs) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 515 | | SOME(ys,ysq) => SOME(x::ys,G ysq)) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 516 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 517 | SOME (x :: xs, G xsq) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 518 | end) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 519 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 520 | fun commute xqs = make (fn () => F xqs) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 521 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 522 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 523 | (*the list of the first n elements, paired with rest of sequence; | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 524 | if length of list is less than n, then sequence had less than n elements*) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 525 | fun chop (n, xq) = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 526 | if n <= 0 | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 527 | then ([], xq) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 528 | else | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 529 | case getItem xq of | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 530 | NONE => ([], xq) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 531 | | SOME (x, xq') => apfst (Library.cons x) (chop (n - 1, xq')) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 532 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 533 | fun foldl f e s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 534 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 535 | fun F k NONE = k e | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 536 | | F k (SOME(x,s)) = F (fn y => k (f(x,y))) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 537 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 538 | F (fn x => x) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 539 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 540 | |
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 541 | fun foldr f e s = | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 542 | let | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 543 | fun F e NONE = e | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 544 | | F e (SOME(x,s)) = F (f(x,e)) (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 545 | in | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 546 | F e (getItem s) | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 547 | end | 
| 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 548 | |
| 19095 | 549 | fun fromString s = of_list (explode s) | 
| 19089 | 550 | |
| 17802 
f3b1ca16cebd
moved susp.ML, lazy_seq.ML, lazy_scan.ML to HOL/Import;
 wenzelm parents: diff
changeset | 551 | end | 
| 19089 | 552 | |
| 553 | structure LazyScan = Scanner (structure Seq = LazySeq) | |
| 554 |