ChemPal Documentation - v1.6.0
    Preparing search index...

    Type Alias ValidateSmiles<S, Parens, Brackets>

    ValidateSmiles: S extends `${infer C}${infer Rest}`
        ? C extends "("
            ? ValidateSmiles<Rest, [0, ...Parens], Brackets>
            : C extends ")"
                ? Parens extends [0, ...(infer PRest extends 0[])]
                    ? ValidateSmiles<Rest, PRest, Brackets>
                    : false
                : C extends "["
                    ? ValidateSmiles<Rest, Parens, [0, ...Brackets]>
                    : C extends "]"
                        ? Brackets extends [0, ...(infer BRest extends 0[])]
                            ? ValidateSmiles<Rest, Parens, BRest>
                            : false
                        : C extends SmilesChar ? ValidateSmiles<Rest, Parens, Brackets> : false
        : Parens extends [] ? Brackets extends [] ? true : false : false

    Walks the string one character at a time, tracking the open ( and [ depth as tuple lengths (Parens / Brackets). Written as a tail-recursive conditional type so TypeScript's tail-call optimisation can handle long inputs — the longest of the supplied examples is ~357 characters, comfortably under the ~1000-step limit.

    Resolves to true only when every character is legal, every close has a matching open, and both stacks are empty at the end. Any illegal character or unbalanced delimiter short-circuits to false.

    Type Parameters

    • S extends string
    • Parens extends 0[] = []
    • Brackets extends 0[] = []