PulseOperationResult.ImportFor opening in other modules.
SatUnsat and AccessResult.let operators produce _ t values following the naming convention letXY where X and Y depend on the types of the inputs: in letXY a = b in c, X is according to the SatUnsat.t behaviour and Y about the AccessResult.t behaviour:
X is * if b is a SatUnsat.t and c a SatUnsat.t too (bind)X is + if b is a SatUnsat.t and c is not (map)X is = if b is *not* a SatUnsat.t and c is a SatUnsat.tSimilarly Y is * or + depending on whether the operation on the underlying AccessResult.t is a map or or bind.
We also define inline operations >>UV with U being =, |, or > corresponding to *, +, or = above, and similarly for V.
In practice, to figure out which let binder or operator is right for your call site, just have a look at the types! To figure out which letXY to use for letXY a = b in c, pick the one with the type type_of_b -> (type_of_a -> type_of_c) -> type_of_letXY_a_equal_b_in_c.
include module type of PulseResult.Let_syntaxinclude module type of PulseResult.Monad_infixinclude module type of PulseResult.Typetype ('ok, 'err) pulse_result = ('ok, 'err) PulseResult.t = val (>>|) :
('ok, 'err) PulseResult.t ->
('ok -> 'okk) ->
('okk, 'err) PulseResult.tval (>>=) :
('ok, 'err) PulseResult.t ->
('ok -> ('okk, 'err) PulseResult.t) ->
('okk, 'err) PulseResult.tval (let+) :
('ok, 'err) PulseResult.t ->
('ok -> 'okk) ->
('okk, 'err) PulseResult.tval (let*) :
('ok, 'err) PulseResult.t ->
('ok -> ('okk, 'err) PulseResult.t) ->
('okk, 'err) PulseResult.tval (let+*) :
'a t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t) ->
'b tval (>>|=) :
'a t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t) ->
'b tval (let=*) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> 'b t) ->
'b tval (>>>=) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> 'b t) ->
'b tval (let=+) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t) ->
'b tval (>>>|) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t) ->
'b tval (let<*>) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t list) ->
'b Pulselib.PulseDomainInterface.AccessResult.t listmonadic "bind" but not really that turns an AccessResult.t into a list of AccessResult.ts (not really because the first type is not an AccessResult.t list but just an AccessResult.t)
val (let<**>) :
'a t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t list) ->
'b Pulselib.PulseDomainInterface.AccessResult.t listval bind_sat_result :
'c ->
'a t ->
('a -> 'b Pulselib.PulseDomainInterface.AccessResult.t list * 'c) ->
'b Pulselib.PulseDomainInterface.AccessResult.t list * 'cval (let<+>) :
'a Pulselib.PulseDomainInterface.AccessResult.t ->
('a -> Pulselib.PulseDomainInterface.AbductiveDomain.t) ->
Pulselib.PulseDomainInterface.ExecutionDomain.t
Pulselib.PulseDomainInterface.AccessResult.t
listmonadic "map" but even less really that turns a AccessResult.t into an analysis result
val (let<++>) :
'a t ->
('a -> Pulselib.PulseDomainInterface.AbductiveDomain.t) ->
Pulselib.PulseDomainInterface.ExecutionDomain.t
Pulselib.PulseDomainInterface.AccessResult.t
listtype 'abductive_domain_t execution_domain_base_t =
'abductive_domain_t Pulselib.PulseDomainInterface.ExecutionDomain.base_t =
| ContinueProgram of 'abductive_domain_t| ExceptionRaised of 'abductive_domain_t| Stopped of Pulselib.PulseDomainInterface.ExecutionDomain.stopped_executiontype base_error = Pulselib.PulseDomainInterface.AccessResult.error = | PotentialInvalidAccess of {astate : Pulselib.PulseDomainInterface.AbductiveDomain.t;address : Pulselib.PulseDomainInterface.DecompilerExpr.t;must_be_valid : Pulselib.PulseBasicInterface.Trace.t
* Pulselib.PulseBasicInterface.Invalidation.must_be_valid_reason
option;}| PotentialInvalidSpecializedCall of {astate : Pulselib.PulseDomainInterface.AbductiveDomain.t;specialized_type : IR.Typ.Name.t;trace : Pulselib.PulseBasicInterface.Trace.t;}| ReportableError of {astate : Pulselib.PulseDomainInterface.AbductiveDomain.t;diagnostic : Pulselib.PulseDomainInterface.Diagnostic.t;}| WithSummary of base_error
* Pulselib.PulseDomainInterface.AbductiveDomain.Summary.t