84 fun make f = Seq (delay f) |
84 fun make f = Seq (delay f) |
85 |
85 |
86 fun null s = is_some (getItem s) |
86 fun null s = is_some (getItem s) |
87 |
87 |
88 local |
88 local |
89 fun F n None = n |
89 fun F n NONE = n |
90 | F n (Some(_,s)) = F (n+1) (getItem s) |
90 | F n (SOME(_,s)) = F (n+1) (getItem s) |
91 in |
91 in |
92 fun length s = F 0 (getItem s) |
92 fun length s = F 0 (getItem s) |
93 end |
93 end |
94 |
94 |
95 fun s1 @ s2 = |
95 fun s1 @ s2 = |
96 let |
96 let |
97 fun F None = getItem s2 |
97 fun F NONE = getItem s2 |
98 | F (Some(x,s1')) = Some(x,F' s1') |
98 | F (SOME(x,s1')) = SOME(x,F' s1') |
99 and F' s = make (fn () => F (getItem s)) |
99 and F' s = make (fn () => F (getItem s)) |
100 in |
100 in |
101 F' s1 |
101 F' s1 |
102 end |
102 end |
103 |
103 |
104 local |
104 local |
105 fun F None = raise Empty |
105 fun F NONE = raise Empty |
106 | F (Some arg) = arg |
106 | F (SOME arg) = arg |
107 in |
107 in |
108 fun hd s = #1 (F (getItem s)) |
108 fun hd s = #1 (F (getItem s)) |
109 fun tl s = #2 (F (getItem s)) |
109 fun tl s = #2 (F (getItem s)) |
110 end |
110 end |
111 |
111 |
112 local |
112 local |
113 fun F x None = x |
113 fun F x NONE = x |
114 | F _ (Some(x,s)) = F x (getItem s) |
114 | F _ (SOME(x,s)) = F x (getItem s) |
115 fun G None = raise Empty |
115 fun G NONE = raise Empty |
116 | G (Some(x,s)) = F x (getItem s) |
116 | G (SOME(x,s)) = F x (getItem s) |
117 in |
117 in |
118 fun last s = G (getItem s) |
118 fun last s = G (getItem s) |
119 end |
119 end |
120 |
120 |
121 local |
121 local |
122 fun F None _ = raise Subscript |
122 fun F NONE _ = raise Subscript |
123 | F (Some(x,_)) 0 = x |
123 | F (SOME(x,_)) 0 = x |
124 | F (Some(_,s)) n = F (getItem s) (n-1) |
124 | F (SOME(_,s)) n = F (getItem s) (n-1) |
125 in |
125 in |
126 fun nth(s,n) = |
126 fun nth(s,n) = |
127 if n < 0 |
127 if n < 0 |
128 then raise Subscript |
128 then raise Subscript |
129 else F (getItem s) n |
129 else F (getItem s) n |
130 end |
130 end |
131 |
131 |
132 local |
132 local |
133 fun F None _ = raise Subscript |
133 fun F NONE _ = raise Subscript |
134 | F (Some(x,s)) n = Some(x,F' s (n-1)) |
134 | F (SOME(x,s)) n = SOME(x,F' s (n-1)) |
135 and F' s 0 = Seq (value None) |
135 and F' s 0 = Seq (value NONE) |
136 | F' s n = make (fn () => F (getItem s) n) |
136 | F' s n = make (fn () => F (getItem s) n) |
137 in |
137 in |
138 fun take (s,n) = |
138 fun take (s,n) = |
139 if n < 0 |
139 if n < 0 |
140 then raise Subscript |
140 then raise Subscript |
141 else F' s n |
141 else F' s n |
142 end |
142 end |
143 |
143 |
144 local |
144 local |
145 fun F s 0 = s |
145 fun F s 0 = s |
146 | F None _ = raise Subscript |
146 | F NONE _ = raise Subscript |
147 | F (Some(_,s)) n = F (getItem s) (n-1) |
147 | F (SOME(_,s)) n = F (getItem s) (n-1) |
148 in |
148 in |
149 fun drop (s,0) = s |
149 fun drop (s,0) = s |
150 | drop (s,n) = |
150 | drop (s,n) = |
151 if n < 0 |
151 if n < 0 |
152 then raise Subscript |
152 then raise Subscript |
153 else make (fn () => F (getItem s) n) |
153 else make (fn () => F (getItem s) n) |
154 end |
154 end |
155 |
155 |
156 local |
156 local |
157 fun F s None = s |
157 fun F s NONE = s |
158 | F s (Some(x,s')) = F (Some(x, Seq (value s))) (getItem s') |
158 | F s (SOME(x,s')) = F (SOME(x, Seq (value s))) (getItem s') |
159 in |
159 in |
160 fun rev s = make (fn () => F None (getItem s)) |
160 fun rev s = make (fn () => F NONE (getItem s)) |
161 end |
161 end |
162 |
162 |
163 local |
163 local |
164 fun F s None = getItem s |
164 fun F s NONE = getItem s |
165 | F s (Some(x,s')) = F (Seq (value (Some(x,s)))) (getItem s') |
165 | F s (SOME(x,s')) = F (Seq (value (SOME(x,s)))) (getItem s') |
166 in |
166 in |
167 fun revAppend (s1,s2) = make (fn () => F s2 (getItem s1)) |
167 fun revAppend (s1,s2) = make (fn () => F s2 (getItem s1)) |
168 end |
168 end |
169 |
169 |
170 local |
170 local |
171 fun F None = None |
171 fun F NONE = NONE |
172 | F (Some(s1,s2)) = |
172 | F (SOME(s1,s2)) = |
173 let |
173 let |
174 fun G None = F (getItem s2) |
174 fun G NONE = F (getItem s2) |
175 | G (Some(x,s)) = Some(x,make (fn () => G (getItem s))) |
175 | G (SOME(x,s)) = SOME(x,make (fn () => G (getItem s))) |
176 in |
176 in |
177 G (getItem s1) |
177 G (getItem s1) |
178 end |
178 end |
179 in |
179 in |
180 fun concat s = make (fn () => F (getItem s)) |
180 fun concat s = make (fn () => F (getItem s)) |
181 end |
181 end |
182 |
182 |
183 fun app f = |
183 fun app f = |
184 let |
184 let |
185 fun F None = () |
185 fun F NONE = () |
186 | F (Some(x,s)) = |
186 | F (SOME(x,s)) = |
187 (f x; |
187 (f x; |
188 F (getItem s)) |
188 F (getItem s)) |
189 in |
189 in |
190 F o getItem |
190 F o getItem |
191 end |
191 end |
192 |
192 |
193 fun map f = |
193 fun map f = |
194 let |
194 let |
195 fun F None = None |
195 fun F NONE = NONE |
196 | F (Some(x,s)) = Some(f x,F' s) |
196 | F (SOME(x,s)) = SOME(f x,F' s) |
197 and F' s = make (fn() => F (getItem s)) |
197 and F' s = make (fn() => F (getItem s)) |
198 in |
198 in |
199 F' |
199 F' |
200 end |
200 end |
201 |
201 |
202 fun mapPartial f = |
202 fun mapPartial f = |
203 let |
203 let |
204 fun F None = None |
204 fun F NONE = NONE |
205 | F (Some(x,s)) = |
205 | F (SOME(x,s)) = |
206 (case f x of |
206 (case f x of |
207 Some y => Some(y,F' s) |
207 SOME y => SOME(y,F' s) |
208 | None => F (getItem s)) |
208 | NONE => F (getItem s)) |
209 and F' s = make (fn()=> F (getItem s)) |
209 and F' s = make (fn()=> F (getItem s)) |
210 in |
210 in |
211 F' |
211 F' |
212 end |
212 end |
213 |
213 |
214 fun find P = |
214 fun find P = |
215 let |
215 let |
216 fun F None = None |
216 fun F NONE = NONE |
217 | F (Some(x,s)) = |
217 | F (SOME(x,s)) = |
218 if P x |
218 if P x |
219 then Some x |
219 then SOME x |
220 else F (getItem s) |
220 else F (getItem s) |
221 in |
221 in |
222 F o getItem |
222 F o getItem |
223 end |
223 end |
224 |
224 |
225 (*fun filter p = mapPartial (fn x => if p x then Some x else None)*) |
225 (*fun filter p = mapPartial (fn x => if p x then SOME x else NONE)*) |
226 |
226 |
227 fun filter P = |
227 fun filter P = |
228 let |
228 let |
229 fun F None = None |
229 fun F NONE = NONE |
230 | F (Some(x,s)) = |
230 | F (SOME(x,s)) = |
231 if P x |
231 if P x |
232 then Some(x,F' s) |
232 then SOME(x,F' s) |
233 else F (getItem s) |
233 else F (getItem s) |
234 and F' s = make (fn () => F (getItem s)) |
234 and F' s = make (fn () => F (getItem s)) |
235 in |
235 in |
236 F' |
236 F' |
237 end |
237 end |
238 |
238 |
239 fun partition f s = |
239 fun partition f s = |
240 let |
240 let |
241 val s' = map (fn x => (x,f x)) s |
241 val s' = map (fn x => (x,f x)) s |
242 in |
242 in |
243 (mapPartial (fn (x,true) => Some x | _ => None) s', |
243 (mapPartial (fn (x,true) => SOME x | _ => NONE) s', |
244 mapPartial (fn (x,false) => Some x | _ => None) s') |
244 mapPartial (fn (x,false) => SOME x | _ => NONE) s') |
245 end |
245 end |
246 |
246 |
247 fun exists P = |
247 fun exists P = |
248 let |
248 let |
249 fun F None = false |
249 fun F NONE = false |
250 | F (Some(x,s)) = P x orelse F (getItem s) |
250 | F (SOME(x,s)) = P x orelse F (getItem s) |
251 in |
251 in |
252 F o getItem |
252 F o getItem |
253 end |
253 end |
254 |
254 |
255 fun all P = |
255 fun all P = |
256 let |
256 let |
257 fun F None = true |
257 fun F NONE = true |
258 | F (Some(x,s)) = P x andalso F (getItem s) |
258 | F (SOME(x,s)) = P x andalso F (getItem s) |
259 in |
259 in |
260 F o getItem |
260 F o getItem |
261 end |
261 end |
262 |
262 |
263 (*fun tabulate f = map f (iterates (fn x => x + 1) 0)*) |
263 (*fun tabulate f = map f (iterates (fn x => x + 1) 0)*) |
264 |
264 |
265 fun tabulate (n,f) = |
265 fun tabulate (n,f) = |
266 let |
266 let |
267 fun F n = make (fn () => Some(f n,F (n+1))) |
267 fun F n = make (fn () => SOME(f n,F (n+1))) |
268 in |
268 in |
269 F n |
269 F n |
270 end |
270 end |
271 |
271 |
272 fun collate c (s1,s2) = |
272 fun collate c (s1,s2) = |
273 let |
273 let |
274 fun F None _ = LESS |
274 fun F NONE _ = LESS |
275 | F _ None = GREATER |
275 | F _ NONE = GREATER |
276 | F (Some(x,s1)) (Some(y,s2)) = |
276 | F (SOME(x,s1)) (SOME(y,s2)) = |
277 (case c (x,y) of |
277 (case c (x,y) of |
278 LESS => LESS |
278 LESS => LESS |
279 | GREATER => GREATER |
279 | GREATER => GREATER |
280 | EQUAL => F' s1 s2) |
280 | EQUAL => F' s1 s2) |
281 and F' s1 s2 = F (getItem s1) (getItem s2) |
281 and F' s1 s2 = F (getItem s1) (getItem s2) |
282 in |
282 in |
283 F' s1 s2 |
283 F' s1 s2 |
284 end |
284 end |
285 |
285 |
286 fun empty _ = Seq (value None) |
286 fun empty _ = Seq (value NONE) |
287 fun single x = Seq(value (Some(x,Seq (value None)))) |
287 fun single x = Seq(value (SOME(x,Seq (value NONE)))) |
288 fun cons a = Seq(value (Some a)) |
288 fun cons a = Seq(value (SOME a)) |
289 |
289 |
290 fun cycle seqfn = |
290 fun cycle seqfn = |
291 let |
291 let |
292 val knot = ref (Seq (value None)) |
292 val knot = ref (Seq (value NONE)) |
293 in |
293 in |
294 knot := seqfn (fn () => !knot); |
294 knot := seqfn (fn () => !knot); |
295 !knot |
295 !knot |
296 end |
296 end |
297 |
297 |
298 fun iterates f = |
298 fun iterates f = |
299 let |
299 let |
300 fun F x = make (fn() => Some(x,F (f x))) |
300 fun F x = make (fn() => SOME(x,F (f x))) |
301 in |
301 in |
302 F |
302 F |
303 end |
303 end |
304 |
304 |
305 fun interleave (s1,s2) = |
305 fun interleave (s1,s2) = |
306 let |
306 let |
307 fun F None = getItem s2 |
307 fun F NONE = getItem s2 |
308 | F (Some(x,s1')) = Some(x,interleave(s2,s1')) |
308 | F (SOME(x,s1')) = SOME(x,interleave(s2,s1')) |
309 in |
309 in |
310 make (fn()=> F (getItem s1)) |
310 make (fn()=> F (getItem s1)) |
311 end |
311 end |
312 |
312 |
313 (* val force_all = app ignore *) |
313 (* val force_all = app ignore *) |
314 |
314 |
315 local |
315 local |
316 fun F None = () |
316 fun F NONE = () |
317 | F (Some(x,s)) = F (getItem s) |
317 | F (SOME(x,s)) = F (getItem s) |
318 in |
318 in |
319 fun force_all s = F (getItem s) |
319 fun force_all s = F (getItem s) |
320 end |
320 end |
321 |
321 |
322 fun of_function f = |
322 fun of_function f = |
323 let |
323 let |
324 fun F () = case f () of |
324 fun F () = case f () of |
325 Some x => Some(x,make F) |
325 SOME x => SOME(x,make F) |
326 | None => None |
326 | NONE => NONE |
327 in |
327 in |
328 make F |
328 make F |
329 end |
329 end |
330 |
330 |
331 local |
331 local |
332 fun F [] = None |
332 fun F [] = NONE |
333 | F (x::xs) = Some(x,F' xs) |
333 | F (x::xs) = SOME(x,F' xs) |
334 and F' xs = make (fn () => F xs) |
334 and F' xs = make (fn () => F xs) |
335 in |
335 in |
336 fun of_list xs = F' xs |
336 fun of_list xs = F' xs |
337 end |
337 end |
338 |
338 |
342 let |
342 let |
343 val buffer : char list ref = ref [] |
343 val buffer : char list ref = ref [] |
344 fun get_input () = |
344 fun get_input () = |
345 case !buffer of |
345 case !buffer of |
346 (c::cs) => (buffer:=cs; |
346 (c::cs) => (buffer:=cs; |
347 Some c) |
347 SOME c) |
348 | [] => (case String.explode (TextIO.input is) of |
348 | [] => (case String.explode (TextIO.input is) of |
349 [] => None |
349 [] => NONE |
350 | (c::cs) => (buffer := cs; |
350 | (c::cs) => (buffer := cs; |
351 Some c)) |
351 SOME c)) |
352 in |
352 in |
353 of_function get_input |
353 of_function get_input |
354 end |
354 end |
355 |
355 |
356 local |
356 local |
357 fun F k None = k [] |
357 fun F k NONE = k [] |
358 | F k (Some(x,s)) = F (fn xs => k (x::xs)) (getItem s) |
358 | F k (SOME(x,s)) = F (fn xs => k (x::xs)) (getItem s) |
359 in |
359 in |
360 fun list_of s = F (fn x => x) (getItem s) |
360 fun list_of s = F (fn x => x) (getItem s) |
361 end |
361 end |
362 |
362 |
363 (* Adapted from seq.ML *) |
363 (* Adapted from seq.ML *) |
364 |
364 |
365 val succeed = single |
365 val succeed = single |
366 fun fail _ = Seq (value None) |
366 fun fail _ = Seq (value NONE) |
367 |
367 |
368 (* fun op THEN (f, g) x = flat (map g (f x)) *) |
368 (* fun op THEN (f, g) x = flat (map g (f x)) *) |
369 |
369 |
370 fun op THEN (f, g) = |
370 fun op THEN (f, g) = |
371 let |
371 let |
372 fun F None = None |
372 fun F NONE = NONE |
373 | F (Some(x,xs)) = |
373 | F (SOME(x,xs)) = |
374 let |
374 let |
375 fun G None = F (getItem xs) |
375 fun G NONE = F (getItem xs) |
376 | G (Some(y,ys)) = Some(y,make (fn () => G (getItem ys))) |
376 | G (SOME(y,ys)) = SOME(y,make (fn () => G (getItem ys))) |
377 in |
377 in |
378 G (getItem (g x)) |
378 G (getItem (g x)) |
379 end |
379 end |
380 in |
380 in |
381 fn x => make (fn () => F (getItem (f x))) |
381 fn x => make (fn () => F (getItem (f x))) |
382 end |
382 end |
383 |
383 |
384 fun op ORELSE (f, g) x = |
384 fun op ORELSE (f, g) x = |
385 make (fn () => |
385 make (fn () => |
386 case getItem (f x) of |
386 case getItem (f x) of |
387 None => getItem (g x) |
387 NONE => getItem (g x) |
388 | some => some) |
388 | some => some) |
389 |
389 |
390 fun op APPEND (f, g) x = |
390 fun op APPEND (f, g) x = |
391 let |
391 let |
392 fun copy s = |
392 fun copy s = |
393 case getItem s of |
393 case getItem s of |
394 None => getItem (g x) |
394 NONE => getItem (g x) |
395 | Some(x,xs) => Some(x,make (fn () => copy xs)) |
395 | SOME(x,xs) => SOME(x,make (fn () => copy xs)) |
396 in |
396 in |
397 make (fn () => copy (f x)) |
397 make (fn () => copy (f x)) |
398 end |
398 end |
399 |
399 |
400 fun EVERY fs = foldr THEN (fs, succeed) |
400 fun EVERY fs = foldr THEN (fs, succeed) |
401 fun FIRST fs = foldr ORELSE (fs, fail) |
401 fun FIRST fs = foldr ORELSE (fs, fail) |
402 |
402 |
403 fun TRY f x = |
403 fun TRY f x = |
404 make (fn () => |
404 make (fn () => |
405 case getItem (f x) of |
405 case getItem (f x) of |
406 None => Some(x,Seq (value None)) |
406 NONE => SOME(x,Seq (value NONE)) |
407 | some => some) |
407 | some => some) |
408 |
408 |
409 fun REPEAT f = |
409 fun REPEAT f = |
410 let |
410 let |
411 fun rep qs x = |
411 fun rep qs x = |
412 case getItem (f x) of |
412 case getItem (f x) of |
413 None => Some(x, make (fn () => repq qs)) |
413 NONE => SOME(x, make (fn () => repq qs)) |
414 | Some (x', q) => rep (q :: qs) x' |
414 | SOME (x', q) => rep (q :: qs) x' |
415 and repq [] = None |
415 and repq [] = NONE |
416 | repq (q :: qs) = |
416 | repq (q :: qs) = |
417 case getItem q of |
417 case getItem q of |
418 None => repq qs |
418 NONE => repq qs |
419 | Some (x, q) => rep (q :: qs) x |
419 | SOME (x, q) => rep (q :: qs) x |
420 in |
420 in |
421 fn x => make (fn () => rep [] x) |
421 fn x => make (fn () => rep [] x) |
422 end |
422 end |
423 |
423 |
424 fun REPEAT1 f = THEN (f, REPEAT f); |
424 fun REPEAT1 f = THEN (f, REPEAT f); |