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
end
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