package regular

  1. Overview
  2. Docs
Module type
Class type

Interface that should support any regular data type.


A regular type is catch all term for all data types that are regular, like numbers, characters, strings and their algebraic closure. A proper term for such types would be inductive types. A regular type always has a concrete representation, it is printable, comparable (with total order), hashable, etc.

To contrast, functions, closures, proxies, descriptors, and any co-inductive types are non-regular. The main difference, is that regular type is self contained, where non-regular types, usually represent something that can be only observed, but not really represented with the data type.

On the border line we have Opaque data types. These are types, that pretend to be Regular, but we can't actually inspect their representation.


So what the library actually provides. First of all it defines the Regular interface, that each regular data type is expected to implement. This includes a full set of Io functions, that allows one to read, write and serialize values of the type (see Data interface). It also provides an inteface for creating different collections from the values of that type, including trees, hashtables, maps, sets, etc. Also, it describes the whole algebra of comparison functions. For the opaque data types an interface called Opaque is provided, that is a proper subset of the Regular. It doesn't provide printing and serialization, but has everything that can be derived for a type with a total order (e.g., containers, comparison function, etc).

A functor is provided for each interface, that requires the minimal implementation, and derives the rest.

Finally, a Bytes module is provided that facilitates the transfer from mutable to immutable Strings. It is the extension of OCaml standard Bytes module, enhanced with the expected set of functions.

Type definitions

bytes is a mutable sequence of bytes that has a fixed length.

include sig ... end
val __bin_read_bytes__ : (int -> bytes) Core_kernel.Std.Bin_prot.Read.reader
val bin_shape_bytes : Core_kernel.Std.Bin_prot.Shape.t
val compare_bytes : bytes -> bytes -> int
val bytes_of_sexp : Sexplib.Sexp.t -> bytes
val sexp_of_bytes : bytes -> Sexplib.Sexp.t
Reader and Writer type classes

Each type class is an abstraction of a tuple of function.

type 'a reader

an interface for reading a value from the input.

type 'a writer

an interface for writing a value to the output.

type digest

a string that digests data

include sig ... end
val __bin_read_digest__ : (int -> digest) Core_kernel.Std.Bin_prot.Read.reader
val bin_shape_digest : Core_kernel.Std.Bin_prot.Shape.t
val compare_digest : digest -> digest -> int
val digest_of_sexp : Sexplib.Sexp.t -> digest
val sexp_of_digest : digest -> Sexplib.Sexp.t
type 'a printer = Format.formatter -> 'a -> unit

'a printer constructs a printer type for arbitrary type 'a.

A value of type 'a printer is a function that is expected by the %a specifier of the Format.printf family of functions.

module Printable : sig ... end

Printable data structures.

module Seq : sig ... end

Lazy sequence.

type 'a seq = 'a Seq.t

Abbreviation for 'a Sequence.t

val (^::) : 'a -> 'a seq -> 'a seq

x ^:: xs is a consing operator for sequences

module Data : sig ... end

Data types support module.

module Regular : sig ... end

Regular types models a general concept of value, i.e., something that can be used in way similar to regular int, string, char and other built in types. So that it can be compared, used in maps, sets, hashtables, printer, etc.

module Opaque : sig ... end

Opaque type is like regular type, except that we can print or examine it in any way. So it can't be serialized or pretty-printed. An Opaque.Make can create an instances of such type.

module Bytes : sig ... end

Extension of the standard bytes module.


Innovation. Community. Security.