sig
  type 's layout
  exception ModifyingSealedStruct of string
  type 's t = { layout : 'Record.layout; content : 'Record.content; }
  and 's content
  val get_layout : 'Record.t -> 'Record.layout
  exception AllocatingUnsealedStruct of string
  module Type :
    sig
      type 'a t
      val name : 'Record.Type.t -> string
      val of_yojson :
        'Record.Type.t -> Yojson.Safe.json -> ('a, string) Result.result
      val to_yojson : 'Record.Type.t -> '-> Yojson.Safe.json
      val make :
        name:string ->
        to_yojson:('-> Yojson.Safe.json) ->
        of_yojson:(Yojson.Safe.json -> ('a, string) Result.result) ->
        unit -> 'Record.Type.t
      val make_string :
        name:string ->
        to_string:('-> string) ->
        of_string:(string -> ('a, string) Result.result) ->
        unit -> 'Record.Type.t
      val exn : exn Record.Type.t
      exception UnserializedException of string
      val unit : unit Record.Type.t
      val string : string Record.Type.t
      val int : int Record.Type.t
      val int32 : int32 Record.Type.t
      val int64 : int64 Record.Type.t
      val list : 'Record.Type.t -> 'a list Record.Type.t
      val product_2 :
        string ->
        'Record.Type.t ->
        string -> 'Record.Type.t -> ('a * 'b) Record.Type.t
      val result :
        'Record.Type.t ->
        'Record.Type.t -> ('a, 'b) Result.result Record.Type.t
      val view :
        name:string ->
        read:('-> ('b, string) Result.result) ->
        write:('-> 'a) -> 'Record.Type.t -> 'Record.Type.t
    end
  module Field :
    sig
      type ('a, 's) t
      val name : ('a, 's) Record.Field.t -> string
      val ftype : ('a, 's) Record.Field.t -> 'Record.Type.t
    end
  val get : 'Record.t -> ('a, 's) Record.Field.t -> 'a
  val set : 'Record.t -> ('a, 's) Record.Field.t -> '-> unit
  exception UndefinedField of string
  module Polid :
    sig
      type 'a t
      val fresh : unit -> 'Record.Polid.t
      type ('a, 'b) equal =
          Equal : ('a, 'a) Record.Polid.equal
        | Different : ('a, 'b) Record.Polid.equal
      val equal :
        'Record.Polid.t -> 'Record.Polid.t -> ('a, 'b) Record.Polid.equal
      val to_int : 'Record.Polid.t -> int
      val is_equal : 'Record.Polid.t -> 'Record.Polid.t -> bool
    end
  module Unsafe :
    sig
      val declare : string -> 'Record.layout
      val field :
        'Record.layout ->
        string -> 'Record.Type.t -> ('a, 's) Record.Field.t
      val seal : 'Record.layout -> unit
      val make : 'Record.layout -> 'Record.t
      val layout_name : 'Record.layout -> string
      val layout_id : 'Record.layout -> 'Record.Polid.t
    end
  module Safe :
    sig
      module type LAYOUT =
        sig
          type s
          val layout : Record.Safe.LAYOUT.s Record.layout
          val field :
            string ->
            'Record.Type.t -> ('a, Record.Safe.LAYOUT.s) Record.Field.t
          val seal : unit -> unit
          val layout_name : string
          val layout_id : Record.Safe.LAYOUT.s Record.Polid.t
          val make : unit -> Record.Safe.LAYOUT.s Record.t
        end
      val declare : string -> (module Record.Safe.LAYOUT)
    end
  val to_yojson : 'Record.t -> Yojson.Safe.json
  val of_yojson :
    'Record.layout ->
    Yojson.Safe.json -> ('Record.t, string) Result.result
  module Util :
    sig
      val layout_type : 'Record.layout -> 'Record.t Record.Type.t
      val declare0 : name:string -> 'Record.layout
      val declare1 :
        name:string ->
        f1_name:string ->
        f1_type:'Record.Type.t ->
        'Record.layout * ('a, 's) Record.Field.t
      val declare2 :
        name:string ->
        f1_name:string ->
        f1_type:'a1 Record.Type.t ->
        f2_name:string ->
        f2_type:'a2 Record.Type.t ->
        'Record.layout * ('a1, 's) Record.Field.t *
        ('a2, 's) Record.Field.t
      val declare3 :
        name:string ->
        f1_name:string ->
        f1_type:'a1 Record.Type.t ->
        f2_name:string ->
        f2_type:'a2 Record.Type.t ->
        f3_name:string ->
        f3_type:'a3 Record.Type.t ->
        'Record.layout * ('a1, 's) Record.Field.t *
        ('a2, 's) Record.Field.t * ('a3, 's) Record.Field.t
      val declare4 :
        name:string ->
        f1_name:string ->
        f1_type:'a1 Record.Type.t ->
        f2_name:string ->
        f2_type:'a2 Record.Type.t ->
        f3_name:string ->
        f3_type:'a3 Record.Type.t ->
        f4_name:string ->
        f4_type:'a4 Record.Type.t ->
        'Record.layout * ('a1, 's) Record.Field.t *
        ('a2, 's) Record.Field.t * ('a3, 's) Record.Field.t *
        ('a4, 's) Record.Field.t
    end
  val equal :
    'Record.layout -> 'Record.layout -> ('a, 'b) Record.Polid.equal
end