src/Pure/General/exn.ML
changeset 40234 39af96cc57cb
parent 39472 1cf49add5b40
child 40483 3848283c14bb
equal deleted inserted replaced
40233:b9d15110b97a 40234:39af96cc57cb
     9   datatype 'a result = Result of 'a | Exn of exn
     9   datatype 'a result = Result of 'a | Exn of exn
    10   val get_result: 'a result -> 'a option
    10   val get_result: 'a result -> 'a option
    11   val get_exn: 'a result -> exn option
    11   val get_exn: 'a result -> exn option
    12   val capture: ('a -> 'b) -> 'a -> 'b result
    12   val capture: ('a -> 'b) -> 'a -> 'b result
    13   val release: 'a result -> 'a
    13   val release: 'a result -> 'a
    14   val map_result: ('a -> 'a) -> 'a result -> 'a result
    14   val map_result: ('a -> 'b) -> 'a result -> 'b result
    15   exception Interrupt
    15   exception Interrupt
    16   val interrupt: unit -> 'a
    16   val interrupt: unit -> 'a
    17   val is_interrupt: exn -> bool
    17   val is_interrupt: exn -> bool
    18   val interrupt_exn: 'a result
    18   val interrupt_exn: 'a result
    19   val is_interrupt_exn: 'a result -> bool
    19   val is_interrupt_exn: 'a result -> bool
       
    20   val interruptible_capture: ('a -> 'b) -> 'a -> 'b result
    20   exception EXCEPTIONS of exn list
    21   exception EXCEPTIONS of exn list
    21   val flatten: exn -> exn list
    22   val flatten: exn -> exn list
    22   val flatten_list: exn list -> exn list
    23   val flatten_list: exn list -> exn list
    23   val release_all: 'a result list -> 'a list
    24   val release_all: 'a result list -> 'a list
    24   val release_first: 'a result list -> 'a list
    25   val release_first: 'a result list -> 'a list
    43 
    44 
    44 fun release (Result y) = y
    45 fun release (Result y) = y
    45   | release (Exn e) = reraise e;
    46   | release (Exn e) = reraise e;
    46 
    47 
    47 fun map_result f (Result x) = Result (f x)
    48 fun map_result f (Result x) = Result (f x)
    48   | map_result f e = e;
    49   | map_result f (Exn e) = (Exn e);
    49 
    50 
    50 
    51 
    51 (* interrupts *)
    52 (* interrupts *)
    52 
    53 
    53 exception Interrupt = Interrupt;
    54 exception Interrupt = Interrupt;
    54 
    55 
    55 fun interrupt () = raise Interrupt;
    56 fun interrupt () = raise Interrupt;
    56 
    57 
    57 fun is_interrupt Interrupt = true
    58 fun is_interrupt Interrupt = true
    58   | is_interrupt (IO.Io {cause = Interrupt, ...}) = true
    59   | is_interrupt (IO.Io {cause, ...}) = is_interrupt cause
    59   | is_interrupt _ = false;
    60   | is_interrupt _ = false;
    60 
    61 
    61 val interrupt_exn = Exn Interrupt;
    62 val interrupt_exn = Exn Interrupt;
    62 
    63 
    63 fun is_interrupt_exn (Exn exn) = is_interrupt exn
    64 fun is_interrupt_exn (Exn exn) = is_interrupt exn
    64   | is_interrupt_exn _ = false;
    65   | is_interrupt_exn _ = false;
       
    66 
       
    67 fun interruptible_capture f x =
       
    68   Result (f x) handle e => if is_interrupt e then reraise e else Exn e;
    65 
    69 
    66 
    70 
    67 (* nested exceptions *)
    71 (* nested exceptions *)
    68 
    72 
    69 exception EXCEPTIONS of exn list;
    73 exception EXCEPTIONS of exn list;