sig
  type ('a, 'b) conv = { to_ : '-> 'b; from_ : '-> 'a; }
  type 'a raw =
      Regexp : Re.t * Re.re Lazy.t -> string Tyre.Internal.raw
    | Conv : 'Tyre.Internal.raw *
        ('a, 'b) Tyre.Internal.conv -> 'Tyre.Internal.raw
    | Opt : 'Tyre.Internal.raw -> 'a option Tyre.Internal.raw
    | Alt : 'Tyre.Internal.raw *
        'Tyre.Internal.raw -> [ `Left of '| `Right of 'b ]
                                Tyre.Internal.raw
    | Seq : 'Tyre.Internal.raw *
        'Tyre.Internal.raw -> ('a * 'b) Tyre.Internal.raw
    | Prefix : 'Tyre.Internal.raw *
        'Tyre.Internal.raw -> 'Tyre.Internal.raw
    | Suffix : 'Tyre.Internal.raw *
        'Tyre.Internal.raw -> 'Tyre.Internal.raw
    | Rep : 'Tyre.Internal.raw -> 'Tyre.gen Tyre.Internal.raw
    | Mod : (Re.t -> Re.t) * 'Tyre.Internal.raw -> 'Tyre.Internal.raw
  val from_t : 'Tyre.t -> 'Tyre.Internal.raw
  val to_t : 'Tyre.Internal.raw -> 'Tyre.t
  type _ wit =
      Lit : int -> string Tyre.Internal.wit
    | Conv : 'Tyre.Internal.wit *
        ('a, 'b) Tyre.Internal.conv -> 'Tyre.Internal.wit
    | Opt : Re.markid * 'Tyre.Internal.wit -> 'a option Tyre.Internal.wit
    | Alt : Re.markid * 'Tyre.Internal.wit *
        'Tyre.Internal.wit -> [ `Left of '| `Right of 'b ]
                                Tyre.Internal.wit
    | Seq : 'Tyre.Internal.wit *
        'Tyre.Internal.wit -> ('a * 'b) Tyre.Internal.wit
    | Rep : int * 'Tyre.Internal.wit *
        Re.re -> 'Tyre.gen Tyre.Internal.wit
  val build :
    int -> 'Tyre.Internal.raw -> int * 'Tyre.Internal.wit * Re.t
  val extract :
    original:string -> 'Tyre.Internal.wit -> Re.substrings -> 'a
end