equal
deleted
inserted
replaced
1 (* Title: Pure/Concurrent/lazy_sequential.ML |
|
2 Author: Florian Haftmann and Makarius, TU Muenchen |
|
3 |
|
4 Lazy evaluation with memoing of results and regular exceptions |
|
5 (sequential version). |
|
6 *) |
|
7 |
|
8 structure Lazy: LAZY = |
|
9 struct |
|
10 |
|
11 (* datatype *) |
|
12 |
|
13 datatype 'a expr = |
|
14 Expr of unit -> 'a | |
|
15 Result of 'a Exn.result; |
|
16 |
|
17 abstype 'a lazy = Lazy of 'a expr Unsynchronized.ref |
|
18 with |
|
19 |
|
20 fun lazy e = Lazy (Unsynchronized.ref (Expr e)); |
|
21 fun value a = Lazy (Unsynchronized.ref (Result (Exn.Res a))); |
|
22 |
|
23 fun peek (Lazy r) = |
|
24 (case ! r of |
|
25 Expr _ => NONE |
|
26 | Result res => SOME res); |
|
27 |
|
28 fun is_running _ = false; |
|
29 fun is_finished x = is_some (peek x); |
|
30 val finished_result = peek; |
|
31 |
|
32 |
|
33 (* force result *) |
|
34 |
|
35 fun force_result (Lazy r) = |
|
36 let |
|
37 val result = |
|
38 (case ! r of |
|
39 Expr e => Exn.capture e () |
|
40 | Result res => res); |
|
41 val _ = if Exn.is_interrupt_exn result then () else r := Result result; |
|
42 in result end; |
|
43 |
|
44 fun force r = Exn.release (force_result r); |
|
45 fun map f x = lazy (fn () => f (force x)); |
|
46 |
|
47 |
|
48 (* future evaluation *) |
|
49 |
|
50 fun future params x = |
|
51 if is_finished x then Future.value_result (force_result x) |
|
52 else (singleton o Future.forks) params (fn () => force x); |
|
53 |
|
54 end; |
|
55 end; |
|
56 |
|
57 type 'a lazy = 'a Lazy.lazy; |
|
58 |
|