Module Ocaml_typing.Allowance

type allowed = private
  1. | Allowed
type disallowed = private
  1. | Disallowed
type left_only = allowed * disallowed
type right_only = disallowed * allowed
type both = allowed * allowed
type 'a pos = 'b * 'c constraint 'a = 'b * 'c

Arrange the permissions appropriately for a positive lattice, by doing nothing.

type 'a neg = 'c * 'b constraint 'a = 'b * 'c

Arrange the permissions appropriately for a negative lattice, by swapping left and right.

module type Allow_disallow = sig ... end
module Magic_allow_disallow (X : Allow_disallow) : Allow_disallow with type ('a, 'b, 'd) sided = ('a, 'b, 'd) X.sided

Takes 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).