Module Irmin.Perms

Types representing permissions 'perms for performing operations on a certain type 'perms t.

They are intended to be used as phantom parameters of the types that they control access to. As an example, consider the following type of references with permissions:

module Ref : sig
  type (+'a, -'perms) t

  val create : 'a -> ('a, read_write) t
  val get : ('a, [> read ]) t -> 'a
  val set : ('a, [> write ]) t -> 'a -> unit

This type allows references to be created with arbitrary read-write access. One can then create weaker views onto the reference – with access to fewer operations – by upcasting:

let read_only t = (t :> (_, read) Ref.t)
let write_only t = (t :> (_, write) Ref.t)

Note that the 'perms phantom type parameter should be contravariant: it's safe to discard permissions, but not to gain new ones.

module Read : sig ... end
module Write : sig ... end
module Read_write : sig ... end
type read = Read.t

The type parameter of a handle with read permissions.

type write = Write.t

The type parameter of a handle with write permissions.

type read_write = Read_write.t

The type parameter of a handle with both read and write permissions.