-module SerializerF(S: sig type status end) =
- struct
- type status = S.status
- type obj = string * Obj.t
-
- let require1 = ref (fun _ -> assert false (* unknown data*))
- let already_registered = ref []
-
- let register tag require =
- assert (not (List.mem tag !already_registered));
- already_registered := tag :: !already_registered;
- let old_require1 = !require1 in
- require1 :=
- (fun (tag',data) as x ->
- if tag=tag' then
- require (Obj.magic data) ~refresh_uri_in_universe ~refresh_uri_in_term
- else
- old_require1 x);
- (fun x -> tag,Obj.repr x)
-
- let serialize = serialize
-
- let require ~baseuri status =
- includes := baseuri::!includes;
- let dump = require0 ~baseuri in
- List.fold_right !require1 dump status
-end
-
-type sstatus = status
-
-module Serializer =
- struct
- include SerializerF(struct type status = sstatus end)
-
- let require ~baseuri status =
- let rstatus = require ~baseuri (status : #status :> status) in
- let status = status#set_coerc_db (rstatus#coerc_db) in
- let status = status#set_uhint_db (rstatus#uhint_db) in
- let status = status#set_timestamp (rstatus#timestamp) in
- status
- end