type nonrec a = < x: int   > 
type nonrec u = < a ;u: int   > 
type nonrec v = < v: int  ;a  > 
type nonrec w = < j: int  ;a ;k: int  ;v  > 
type nonrec t = < a ;u: int   >  as 'a
type nonrec t = < a ;u: int   >  -> unit (a:1)
type nonrec t = (< a ;u: int   >  as 'a) -> unit (a:1)
type nonrec t = < a ;u: int   >  -> < a ;v: int   >  -> unit (a:2)
type nonrec user = < name: string   > 
let (steve : < user ;age: int   > ) =
  [%obj { name = {js|Steve|js}; age = 30 }]
let steve =
  ([%obj { name = {js|Steve|js}; age = 30 }] : < user ;age: int   > )
let steve =
  ((([%obj { name = {js|Steve|js}; age = 30 }] : < user ;age: int   > ))
  [@res.braces ])
let printFullUser [arity:1](steve : < user ;age: int   > ) = Js.log steve
let printFullUser [arity:1]~user:(user : < user ;age: int   > )  =
  Js.log steve
let printFullUser [arity:1]~user:(user : < user ;age: int   > )  =
  Js.log steve
let printFullUser [arity:1]?(user= (steve : < user ;age: int   > ))  =
  Js.log steve
external steve : < user ;age: int   >  = "steve"[@@val ]
let makeCeoOf30yearsOld [arity:1]name =
  ([%obj { name; age = 30 }] : < user ;age: int   > )
type nonrec optionalUser = < user ;age: int   >  option
type nonrec optionalTupleUser =
  (< user ;age: int   >  * < user ;age: int   > ) option
type nonrec constrUser =
  (< user ;age: int   > , < user ;age: int   > ) myTypeConstructor
type nonrec taggedUser =
  | User of < user ;age: int   >  
  | Ceo of < user ;age: int  ;direction: bool   >  *
  < salary ;taxFraud: bool   >  
type nonrec polyTaggedUser = [ `User of < user ;age: int   >  ]
type nonrec polyTaggedUser2 =
  [ `User of < user ;age: int   >  
  | `Ceo of
      (< user ;age: int  ;direction: bool   >  *
        < salary ;taxFraud: bool   > )
      ]