X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=helm%2Fmatita%2FmatitaProof.ml;h=9afb90a714b36ca53090f0e63b68aa743d2bd9f0;hb=7deafec4fd4b2eebf4d4061f21ee5c47bd15b062;hp=ca1b4c9077f9bb32f5af79e0ddf4e5154e224e7e;hpb=3705200c998538c28d8cd9d3ca557616837daf05;p=helm.git diff --git a/helm/matita/matitaProof.ml b/helm/matita/matitaProof.ml index ca1b4c907..9afb90a71 100644 --- a/helm/matita/matitaProof.ml +++ b/helm/matita/matitaProof.ml @@ -106,9 +106,52 @@ class proof ?uri ~typ ~metasenv ~body () = end +class currentProof = + let fail () = failwith "No current proof" in + object (self) + val mutable _proof: MatitaTypes.proof option = None + val mutable observers = [] + val mutable callbacks = [] + + initializer self#connect `Abort (fun () -> _proof <- None; false) + + (** execute all callbacks related to a given event until one of them + * return true or the end of the callback list is reached *) + method private do_callbacks event = + let rec aux = function + | [] -> () + | (event', f) :: tl when event' = event -> if not (f ()) then aux tl + | _ :: tl -> aux tl + in + aux callbacks + + method addObserver o = observers <- o :: observers + + method connect (event:[`Abort|`Quit]) f = + callbacks <- (event, f) :: callbacks + + method onGoing () = _proof <> None + method proof = match _proof with None -> fail () | Some proof -> proof + method start (proof: MatitaTypes.proof) = + List.iter + (fun observer -> + ignore (proof#attach_observer + ~interested_in:StatefulProofEngine.all_events observer)) + observers; + proof#notify; + _proof <- Some proof + method abort () = self#do_callbacks `Abort + method quit () = self#do_callbacks `Quit + end + let proof ?uri ~metasenv ~typ () = let metasenv = (1, [], typ) :: metasenv in let body = Cic.Meta (1,[]) in let _ = CicTypeChecker.type_of_aux' metasenv [] typ in new proof ~typ ~metasenv ~body ?uri () +let currentProof () = new currentProof +let instance = + let currentProof = lazy (currentProof ()) in + fun () -> Lazy.force currentProof +