`type value =`

1. `| Bool of bool`
2. `| String of string`
3. `| Version of int * int * int`

`val value_equal : value -> value -> bool`
`val f : variables:(string * value) list -> filename:string -> contents:string -> string`
`type source =`

1. `| Binary`
   (*

   Binary file (skipped by the preprocessor)

   *)
2. `| File`
   (*

   Not read yet

   *)
3. `| Contents of string`
   (*

   File contents to preprocess

   *)

`type input = {`

1. `module_name : string;`
   (*

   Name under which the module should be imported (used to fill the `Binary.link_input` record)

   *)
2. `file : string;`
   (*

   File originally containing the module

   *)
3. `source : source;`
   (*

   Information about the file, including possibly the already read file contents

   *)

`}`
`val with_preprocessed_files : variables:(string * value) list -> inputs:input list -> (Binaryen.link_input list -> 'a) -> 'a`