type ex = | E : { module_ : (module S.Analyzer with type Expression.t = 'a and type Expression.t' = 'b and type Instruction.t = 'c and type Instruction.t' = 'd and type Location.t = 'e and type context = 'f); expr_witness : 'a Type.Id.t; expr' : 'b Type.Id.t; instr_witness : 'c Type.Id.t; instr' : 'd Type.Id.t; location_witness : 'e Type.Id.t; context : 'f Type.Id.t; } -> ex (** Type of check to apply *) let build : ?location_id:'a Type.Id.t -> ?context_id:'b Type.Id.t -> (module S.Analyzer with type Expression.t = _ and type Expression.t' = _ and type Instruction.t = _ and type Instruction.t' = _ and type Location.t = 'a and type context = 'b) -> ex = fun ?location_id ?context_id module_ -> let expr_witness = Type.Id.make () and expr' = Type.Id.make () and instr_witness = Type.Id.make () and instr' = Type.Id.make () and location_witness = match location_id with Some v -> v | None -> Type.Id.make () and context = match context_id with Some v -> v | None -> Type.Id.make () in E { module_; expr_witness; expr'; instr_witness; instr'; location_witness; context; }