From 383229717e0d68e5cff4567cf35e19e48a7b1c19 Mon Sep 17 00:00:00 2001
From: Thibaut Benjamin <thibaut.benjamin@gmail.com>
Date: Tue, 18 Jan 2022 15:10:29 +0100
Subject: [PATCH] [e-acsl] auxilliary functions for error management

---
 src/plugins/e-acsl/src/analyses/interval.ml |  1 -
 src/plugins/e-acsl/src/analyses/typing.ml   |  3 +--
 src/plugins/e-acsl/src/libraries/error.ml   | 21 +++++++++++++++++++++
 src/plugins/e-acsl/src/libraries/error.mli  | 10 ++++++++--
 4 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/plugins/e-acsl/src/analyses/interval.ml b/src/plugins/e-acsl/src/analyses/interval.ml
index 86bcf2fb9a0..ac50f02b6a2 100644
--- a/src/plugins/e-acsl/src/analyses/interval.ml
+++ b/src/plugins/e-acsl/src/analyses/interval.ml
@@ -400,7 +400,6 @@ module Profile = struct
       (struct
         let module_name = "E_ACSL.Interval.Logic_function_env.Profile"
       end)
-  let is_included p1 p2 = List.for_all2 is_included p1 p2
 end
 
 (* Imperative environments *)
diff --git a/src/plugins/e-acsl/src/analyses/typing.ml b/src/plugins/e-acsl/src/analyses/typing.ml
index d4022ccc0b1..6394220aca7 100644
--- a/src/plugins/e-acsl/src/analyses/typing.ml
+++ b/src/plugins/e-acsl/src/analyses/typing.ml
@@ -199,8 +199,7 @@ module Memo: sig
     (term -> computed_info) ->
     term ->
     computed_info Error.result
-  val get: lenv:Function_params_ty.t -> term ->
-    computed_info Error.result
+  val get: lenv:Function_params_ty.t -> term -> computed_info Error.result
   val clear: unit -> unit
 end = struct
 
diff --git a/src/plugins/e-acsl/src/libraries/error.ml b/src/plugins/e-acsl/src/libraries/error.ml
index 1b32febdce7..4e23a570061 100644
--- a/src/plugins/e-acsl/src/libraries/error.ml
+++ b/src/plugins/e-acsl/src/libraries/error.ml
@@ -54,6 +54,9 @@ module type S = sig
     Format.formatter ->
     'a result ->
     unit
+  val map: ('a -> 'b) -> 'a result -> 'b
+  val map2: ('a -> 'b -> 'c) -> 'a result -> 'b result -> 'c
+  val map3 : ('a -> 'b -> 'c -> 'd) -> 'a result -> 'b result -> 'c result -> 'd
 end
 
 module Make_with_opt(P: sig val phase:Options.category option end): S = struct
@@ -125,6 +128,24 @@ module Make_with_opt(P: sig val phase:Options.category option end): S = struct
     match res with
     | Result.Ok a -> Format.fprintf fmt "@[%a@]" pp a
     | Result.Error err -> Format.fprintf fmt "@[%s@]" (Printexc.to_string err)
+
+  let map f = function
+    | Result.Ok a -> f a
+    | Result.Error e -> raise e
+
+  let map2 f a b =
+    match a,b with
+    | Result.Ok a, Result.Ok b -> f a b
+    | Result.Ok _, Result.Error e -> raise e
+    | Result.Error e, _ -> raise e
+
+  let map3 f a b c =
+    match a,b,c with
+    | Result.Ok a, Result.Ok b, Result.Ok c -> f a b c
+    | Result.Ok _, Result.Ok _, Result.Error e -> raise e
+    | Result.Ok _, Result.Error e, _ -> raise e
+    | Result.Error e, _, _ -> raise e
+
 end
 
 module Make(P: sig val phase:Options.category end): S =
diff --git a/src/plugins/e-acsl/src/libraries/error.mli b/src/plugins/e-acsl/src/libraries/error.mli
index 599ec5cd1bb..a4a690ab56a 100644
--- a/src/plugins/e-acsl/src/libraries/error.mli
+++ b/src/plugins/e-acsl/src/libraries/error.mli
@@ -81,8 +81,14 @@ module type S = sig
     Format.formatter ->
     'a result ->
     unit
-    (** [pp_result pp] where [pp] is a formatter for ['a] returns a formatter for
-        ['a result]. *)
+  (** [pp_result pp] where [pp] is a formatter for ['a] returns a formatter for
+      ['a result]. *)
+
+  val map : ('a -> 'b) -> 'a result -> 'b
+  val map2 : ('a -> 'b -> 'c) -> 'a result -> 'b result -> 'c
+  val map3 : ('a -> 'b -> 'c -> 'd) -> 'a result -> 'b result -> 'c result -> 'd
+  (** Apply a function to one or several results and propagate the errors *)
+
 end
 
 (** Functor to build an [Error] module for a given [phase]. *)
-- 
GitLab