Create Interface src/CreateInterface.res
type r = {name: string, age: int}
let add: (~x: int, ~y: int) => int
@react.component
let make: (~name: string) => React.element
module Other: {
  @react.component
  let otherComponentName: (~name: string) => React.element
}
module Mod: {
  @react.component
  let make: (~name: string) => React.element
}
module type ModTyp = {
  @react.component
  let make: (~name: string) => React.element
}
@module("path") external dirname: string => string = "dirname"
@module("path") @variadic
external join: array<string> => string = "join"
@val
external padLeft: (
  string,
  @unwrap
  [
    | #Str(string)
    | #Int(int)
  ],
) => string = "padLeft"
@inline
let f1: int
@inline let f2: string
@genType @inline
let f3: int
@genType @inline
let f4: string
@genType @inline let f5: float
module RFS: {
  @module("fs")
  external readFileSync: (
    ~name: string,
    @string
    [
      | #utf8
      | @as("ascii") #useAscii
    ],
  ) => string = "readFileSync"
}
module Functor: () =>
{
  @react.component
  let make: unit => React.element
}
module type FT = {
  module Functor: (
    X: {
      let a: int
      @react.component
      let make: (~name: string) => React.element
      let b: int
    },
    Y: ModTyp,
  ) =>
  {
    @react.component
    let make: (~name: string) => React.element
  }
}
module NormaList = List
module BeltList = Belt.List
module type MT2 = ModTyp
module rec RM: ModTyp
and D: ModTyp
module type OptT = {
  @react.component
  let withOpt1: (~x: int=?, ~y: int) => React.element
  module type Opt2 = {
    @react.component
    let withOpt2: (~x: int=?, ~y: int) => React.element
  }
  module type Opt3 = {
    @react.component
    let withOpt3: (~x: option<int>, ~y: int) => React.element
  }
}
module Opt: {
  @react.component
  let withOpt1: (~x: int=?, ~y: int) => React.element
  module Opt2: {
    @react.component
    let withOpt2: (~x: int=?, ~y: int) => React.element
  }
  module type Opt2 = {
    @react.component
    let withOpt2: (~x: int=?, ~y: int) => React.element
  }
  module Opt3: {
    @react.component
    let withOpt3: (~x: option<int>, ~y: int) => React.element
  }
  module type Opt3 = {
    @react.component
    let withOpt3: (~x: option<int>, ~y: int) => React.element
  }
}
module Opt2: OptT
module Opt3 = Opt
module Memo: {
  @react.component
  let make: (~name: string) => React.element
}
external x: (@as("bar") ~foo: int) => unit = "myexternal"
type record = {
  @as("foo_bar")
  fooBar: int
}
type poly = [#a(int) | #b(string) | #c(float)]
type red = [#Ruby | #Redwood | #Rust]
type blue = [#Sapphire | #Neon | #Navy]
type color = [red | blue | #Papayawhip]
external upperBound: ([< #d | #e | #f]) => unit = "myexternal"
external lowerBound: ([> #d | #e | #f]) => unit = "myexternal"
module ComponentWithPolyProp: {
  @react.component
  let make: (~size: [< #large | #small]=?) => React.element
}
module OrderedSet: {
  type t<'a, 'identity> = {
    cmp: ('a, 'a) => int,
    set: Belt.Set.t<'a, 'identity>,
    array: array<'a>,
  }
  let make: (~id: module(Belt.Id.Comparable with type identity = 'a and type t = 'b)) => t<'b, 'a>
}

