type t('M, 'T) = ('T, t'('M, 'T));and t'('M, 'T) = | Any(option(Syntax.t('M, unit)))| Mixed(option(Syntax.t('M, unit)))| Empty(option(Syntax.t('M, unit)))| Void(option(Syntax.t('M, unit)))| Null(option(Syntax.t('M, unit)))| Number(option(Syntax.t('M, unit)))| BigInt(option(Syntax.t('M, unit)))| String(option(Syntax.t('M, unit)))| Boolean(option(Syntax.t('M, unit)))| Symbol(option(Syntax.t('M, unit)))| Exists(option(Syntax.t('M, unit)))| Nullable(Nullable.t('M, 'T))| Function(Function.t('M, 'T))| Object(Object.t('M, 'T))| Interface(Interface.t('M, 'T))| Array(Array.t('M, 'T))| Generic(Generic.t('M, 'T))| IndexedAccess(IndexedAccess.t('M, 'T))| OptionalIndexedAccess(OptionalIndexedAccess.t('M, 'T))| Union(Union.t('M, 'T))| Intersection(Intersection.t('M, 'T))| Typeof(Typeof.t('M, 'T))| Tuple(Tuple.t('M, 'T))| StringLiteral(StringLiteral.t('M))| NumberLiteral(NumberLiteral.t('M))| BigIntLiteral(BigIntLiteral.t('M))| BooleanLiteral(BooleanLiteral.t('M))
;and annotation('M, 'T) = ('M, t('M, 'T));and annotation_or_hint('M, 'T) = | Missing('T)| Available(annotation('M, 'T))
;