Module Allowance
type left_only = Allowance.allowed * Allowance.disallowedtype right_only = Allowance.disallowed * Allowance.allowedtype both = Allowance.allowed * Allowance.allowedArrange the permissions appropriately for a positive lattice, by doing nothing.
Arrange the permissions appropriately for a negative lattice, by swapping left and right.
module type Allow_disallow = sig ... endmodule Magic_allow_disallow
(X : Allowance.Allow_disallow) :
Allowance.Allow_disallow with type ('a, 'b, 'd) sided = ('a, 'b, 'd) X.sidedTakes a slow but type-correct Allow_disallow module and returns the magic version, which is faster. NOTE: for this to be sound, the functions in the original module must be identity functions (up to runtime representation).