pub const GeneralCategory = enum(u5) {
    letter_uppercase, // Lu
    letter_lowercase, // Ll
    letter_titlecase, // Lt
    letter_modifier, // Lm
    letter_other, // Lo
    mark_nonspacing, // Mn
    mark_spacing_combining, // Mc
    mark_enclosing, // Me
    number_decimal_digit, // Nd
    number_letter, // Nl
    number_other, // No
    punctuation_connector, // Pc
    punctuation_dash, // Pd
    punctuation_open, // Ps
    punctuation_close, // Pe
    punctuation_initial_quote, // Pi
    punctuation_final_quote, // Pf
    punctuation_other, // Po
    symbol_math, // Sm
    symbol_currency, // Sc
    symbol_modifier, // Sk
    symbol_other, // So
    separator_space, // Zs
    separator_line, // Zl
    separator_paragraph, // Zp
    other_control, // Cc
    other_format, // Cf
    other_surrogate, // Cs
    other_private_use, // Co
    other_not_assigned, // Cn
};

pub const BidiClass = enum(u5) {
    left_to_right, // L
    left_to_right_embedding, // LRE
    left_to_right_override, // LRO
    right_to_left, // R
    right_to_left_arabic, // AL
    right_to_left_embedding, // RLE
    right_to_left_override, // RLO
    pop_directional_format, // PDF
    european_number, // EN
    european_number_separator, // ES
    european_number_terminator, // ET
    arabic_number, // AN
    common_number_separator, // CS
    nonspacing_mark, // NSM
    boundary_neutral, // BN
    paragraph_separator, // B
    segment_separator, // S
    whitespace, // WS
    other_neutrals, // ON
    left_to_right_isolate, // LRI
    right_to_left_isolate, // RLI
    first_strong_isolate, // FSI
    pop_directional_isolate, // PDI
};

pub const DecompositionType = enum(u5) {
    default,
    canonical,
    font,
    noBreak,
    initial,
    medial,
    final,
    isolated,
    circle,
    super,
    sub,
    vertical,
    wide,
    narrow,
    small,
    square,
    fraction,
    compat,
};

pub const NumericType = enum(u2) {
    none,
    decimal,
    digit,
    numeric,
};

pub const IndicConjunctBreak = enum(u2) {
    none,
    linker,
    consonant,
    extend,
};

pub const EastAsianWidth = enum(u3) {
    neutral,
    fullwidth,
    halfwidth,
    wide,
    narrow,
    ambiguous,
};

pub const OriginalGraphemeBreak = enum(u4) {
    other,
    prepend,
    cr,
    lf,
    control,
    extend,
    regional_indicator,
    spacing_mark,
    l,
    v,
    t,
    lv,
    lvt,
    zwj,
};

pub const GraphemeBreak = enum(u5) {
    other,
    control,
    prepend,
    cr,
    lf,
    regional_indicator,
    spacing_mark,
    l,
    v,
    t,
    lv,
    lvt,
    zwj,
    zwnj,
    extended_pictographic,
    emoji_modifier_base,
    emoji_modifier,
    // extend, ==
    //   zwnj +
    //   indic_conjunct_break_extend +
    //   indic_conjunct_break_linker
    indic_conjunct_break_extend,
    indic_conjunct_break_linker,
    indic_conjunct_break_consonant,
};

pub const GraphemeBreakNoControl = enum(u5) {
    other,
    prepend,
    regional_indicator,
    spacing_mark,
    l,
    v,
    t,
    lv,
    lvt,
    zwj,
    zwnj,
    extended_pictographic,
    emoji_modifier_base,
    emoji_modifier,
    // extend, ==
    //   zwnj +
    //   indic_conjunct_break_extend +
    //   indic_conjunct_break_linker
    indic_conjunct_break_extend,
    indic_conjunct_break_linker,
    indic_conjunct_break_consonant,
};

pub const SpecialCasingCondition = enum(u4) {
    none,
    final_sigma,
    after_soft_dotted,
    more_above,
    after_i,
    not_before_dot,
    lt,
    tr,
    az,
};

pub const Block = enum(u9) {
    no_block,
    adlam,
    aegean_numbers,
    ahom,
    alchemical_symbols,
    alphabetic_presentation_forms,
    anatolian_hieroglyphs,
    ancient_greek_musical_notation,
    ancient_greek_numbers,
    ancient_symbols,
    arabic,
    arabic_extended_a,
    arabic_extended_b,
    arabic_extended_c,
    arabic_mathematical_alphabetic_symbols,
    arabic_presentation_forms_a,
    arabic_presentation_forms_b,
    arabic_supplement,
    armenian,
    arrows,
    avestan,
    balinese,
    bamum,
    bamum_supplement,
    basic_latin,
    bassa_vah,
    batak,
    bengali,
    beria_erfe,
    bhaiksuki,
    block_elements,
    bopomofo,
    bopomofo_extended,
    box_drawing,
    brahmi,
    braille_patterns,
    buginese,
    buhid,
    byzantine_musical_symbols,
    carian,
    caucasian_albanian,
    chakma,
    cham,
    cherokee,
    cherokee_supplement,
    chess_symbols,
    chorasmian,
    cjk_compatibility,
    cjk_compatibility_forms,
    cjk_compatibility_ideographs,
    cjk_compatibility_ideographs_supplement,
    cjk_radicals_supplement,
    cjk_strokes,
    cjk_symbols_and_punctuation,
    cjk_unified_ideographs,
    cjk_unified_ideographs_extension_a,
    cjk_unified_ideographs_extension_b,
    cjk_unified_ideographs_extension_c,
    cjk_unified_ideographs_extension_d,
    cjk_unified_ideographs_extension_e,
    cjk_unified_ideographs_extension_f,
    cjk_unified_ideographs_extension_g,
    cjk_unified_ideographs_extension_h,
    cjk_unified_ideographs_extension_i,
    cjk_unified_ideographs_extension_j,
    combining_diacritical_marks,
    combining_diacritical_marks_extended,
    combining_diacritical_marks_for_symbols,
    combining_diacritical_marks_supplement,
    combining_half_marks,
    common_indic_number_forms,
    control_pictures,
    coptic,
    coptic_epact_numbers,
    counting_rod_numerals,
    cuneiform,
    cuneiform_numbers_and_punctuation,
    currency_symbols,
    cypriot_syllabary,
    cypro_minoan,
    cyrillic,
    cyrillic_extended_a,
    cyrillic_extended_b,
    cyrillic_extended_c,
    cyrillic_extended_d,
    cyrillic_supplement,
    deseret,
    devanagari,
    devanagari_extended,
    devanagari_extended_a,
    dingbats,
    dives_akuru,
    dogra,
    domino_tiles,
    duployan,
    early_dynastic_cuneiform,
    egyptian_hieroglyph_format_controls,
    egyptian_hieroglyphs,
    egyptian_hieroglyphs_extended_a,
    elbasan,
    elymaic,
    emoticons,
    enclosed_alphanumeric_supplement,
    enclosed_alphanumerics,
    enclosed_cjk_letters_and_months,
    enclosed_ideographic_supplement,
    ethiopic,
    ethiopic_extended,
    ethiopic_extended_a,
    ethiopic_extended_b,
    ethiopic_supplement,
    garay,
    general_punctuation,
    geometric_shapes,
    geometric_shapes_extended,
    georgian,
    georgian_extended,
    georgian_supplement,
    glagolitic,
    glagolitic_supplement,
    gothic,
    grantha,
    greek_and_coptic,
    greek_extended,
    gujarati,
    gunjala_gondi,
    gurmukhi,
    gurung_khema,
    halfwidth_and_fullwidth_forms,
    hangul_compatibility_jamo,
    hangul_jamo,
    hangul_jamo_extended_a,
    hangul_jamo_extended_b,
    hangul_syllables,
    hanifi_rohingya,
    hanunoo,
    hatran,
    hebrew,
    high_private_use_surrogates,
    high_surrogates,
    hiragana,
    ideographic_description_characters,
    ideographic_symbols_and_punctuation,
    imperial_aramaic,
    indic_siyaq_numbers,
    inscriptional_pahlavi,
    inscriptional_parthian,
    ipa_extensions,
    javanese,
    kaithi,
    kaktovik_numerals,
    kana_extended_a,
    kana_extended_b,
    kana_supplement,
    kanbun,
    kangxi_radicals,
    kannada,
    katakana,
    katakana_phonetic_extensions,
    kawi,
    kayah_li,
    kharoshthi,
    khitan_small_script,
    khmer,
    khmer_symbols,
    khojki,
    khudawadi,
    kirat_rai,
    lao,
    latin_1_supplement,
    latin_extended_a,
    latin_extended_additional,
    latin_extended_b,
    latin_extended_c,
    latin_extended_d,
    latin_extended_e,
    latin_extended_f,
    latin_extended_g,
    lepcha,
    letterlike_symbols,
    limbu,
    linear_a,
    linear_b_ideograms,
    linear_b_syllabary,
    lisu,
    lisu_supplement,
    low_surrogates,
    lycian,
    lydian,
    mahajani,
    mahjong_tiles,
    makasar,
    malayalam,
    mandaic,
    manichaean,
    marchen,
    masaram_gondi,
    mathematical_alphanumeric_symbols,
    mathematical_operators,
    mayan_numerals,
    medefaidrin,
    meetei_mayek,
    meetei_mayek_extensions,
    mende_kikakui,
    meroitic_cursive,
    meroitic_hieroglyphs,
    miao,
    miscellaneous_mathematical_symbols_a,
    miscellaneous_mathematical_symbols_b,
    miscellaneous_symbols,
    miscellaneous_symbols_and_arrows,
    miscellaneous_symbols_and_pictographs,
    miscellaneous_symbols_supplement,
    miscellaneous_technical,
    modi,
    modifier_tone_letters,
    mongolian,
    mongolian_supplement,
    mro,
    multani,
    musical_symbols,
    myanmar,
    myanmar_extended_a,
    myanmar_extended_b,
    myanmar_extended_c,
    nabataean,
    nag_mundari,
    nandinagari,
    new_tai_lue,
    newa,
    nko,
    number_forms,
    nushu,
    nyiakeng_puachue_hmong,
    ogham,
    ol_chiki,
    ol_onal,
    old_hungarian,
    old_italic,
    old_north_arabian,
    old_permic,
    old_persian,
    old_sogdian,
    old_south_arabian,
    old_turkic,
    old_uyghur,
    optical_character_recognition,
    oriya,
    ornamental_dingbats,
    osage,
    osmanya,
    ottoman_siyaq_numbers,
    pahawh_hmong,
    palmyrene,
    pau_cin_hau,
    phags_pa,
    phaistos_disc,
    phoenician,
    phonetic_extensions,
    phonetic_extensions_supplement,
    playing_cards,
    private_use_area,
    psalter_pahlavi,
    rejang,
    rumi_numeral_symbols,
    runic,
    samaritan,
    saurashtra,
    sharada,
    sharada_supplement,
    shavian,
    shorthand_format_controls,
    siddham,
    sidetic,
    sinhala,
    sinhala_archaic_numbers,
    small_form_variants,
    small_kana_extension,
    sogdian,
    sora_sompeng,
    soyombo,
    spacing_modifier_letters,
    specials,
    sundanese,
    sundanese_supplement,
    sunuwar,
    superscripts_and_subscripts,
    supplemental_arrows_a,
    supplemental_arrows_b,
    supplemental_arrows_c,
    supplemental_mathematical_operators,
    supplemental_punctuation,
    supplemental_symbols_and_pictographs,
    supplementary_private_use_area_a,
    supplementary_private_use_area_b,
    sutton_signwriting,
    syloti_nagri,
    symbols_and_pictographs_extended_a,
    symbols_for_legacy_computing,
    symbols_for_legacy_computing_supplement,
    syriac,
    syriac_supplement,
    tagalog,
    tagbanwa,
    tags,
    tai_le,
    tai_tham,
    tai_viet,
    tai_xuan_jing_symbols,
    tai_yo,
    takri,
    tamil,
    tamil_supplement,
    tangsa,
    tangut,
    tangut_components,
    tangut_components_supplement,
    tangut_supplement,
    telugu,
    thaana,
    thai,
    tibetan,
    tifinagh,
    tirhuta,
    todhri,
    tolong_siki,
    toto,
    transport_and_map_symbols,
    tulu_tigalari,
    ugaritic,
    unified_canadian_aboriginal_syllabics,
    unified_canadian_aboriginal_syllabics_extended,
    unified_canadian_aboriginal_syllabics_extended_a,
    vai,
    variation_selectors,
    variation_selectors_supplement,
    vedic_extensions,
    vertical_forms,
    vithkuqi,
    wancho,
    warang_citi,
    yezidi,
    yi_radicals,
    yi_syllables,
    yijing_hexagram_symbols,
    zanabazar_square,
    znamenny_musical_notation,
};

pub const BidiPairedBracket = union(enum) {
    open: u21,
    close: u21,
    none: void,
};

pub const Script = enum(u8) {
    unknown,
    adlam,
    ahom,
    anatolian_hieroglyphs,
    arabic,
    armenian,
    avestan,
    balinese,
    bamum,
    bassa_vah,
    batak,
    bengali,
    beria_erfe,
    bhaiksuki,
    bopomofo,
    brahmi,
    braille,
    buginese,
    buhid,
    canadian_aboriginal,
    carian,
    caucasian_albanian,
    chakma,
    cham,
    cherokee,
    chorasmian,
    common,
    coptic,
    cuneiform,
    cypriot,
    cypro_minoan,
    cyrillic,
    deseret,
    devanagari,
    dives_akuru,
    dogra,
    duployan,
    egyptian_hieroglyphs,
    elbasan,
    elymaic,
    ethiopic,
    garay,
    georgian,
    glagolitic,
    gothic,
    grantha,
    greek,
    gujarati,
    gunjala_gondi,
    gurmukhi,
    gurung_khema,
    han,
    hangul,
    hanifi_rohingya,
    hanunoo,
    hatran,
    hebrew,
    hiragana,
    imperial_aramaic,
    inherited,
    inscriptional_pahlavi,
    inscriptional_parthian,
    javanese,
    kaithi,
    kannada,
    katakana,
    kawi,
    kayah_li,
    kharoshthi,
    khitan_small_script,
    khmer,
    khojki,
    khudawadi,
    kirat_rai,
    lao,
    latin,
    lepcha,
    limbu,
    linear_a,
    linear_b,
    lisu,
    lycian,
    lydian,
    mahajani,
    makasar,
    malayalam,
    mandaic,
    manichaean,
    marchen,
    masaram_gondi,
    medefaidrin,
    meetei_mayek,
    mende_kikakui,
    meroitic_cursive,
    meroitic_hieroglyphs,
    miao,
    modi,
    mongolian,
    mro,
    multani,
    myanmar,
    nabataean,
    nag_mundari,
    nandinagari,
    new_tai_lue,
    newa,
    nko,
    nushu,
    nyiakeng_puachue_hmong,
    ogham,
    ol_chiki,
    ol_onal,
    old_hungarian,
    old_italic,
    old_north_arabian,
    old_permic,
    old_persian,
    old_sogdian,
    old_south_arabian,
    old_turkic,
    old_uyghur,
    oriya,
    osage,
    osmanya,
    pahawh_hmong,
    palmyrene,
    pau_cin_hau,
    phags_pa,
    phoenician,
    psalter_pahlavi,
    rejang,
    runic,
    samaritan,
    saurashtra,
    sharada,
    shavian,
    siddham,
    sidetic,
    signwriting,
    sinhala,
    sogdian,
    sora_sompeng,
    soyombo,
    sundanese,
    sunuwar,
    syloti_nagri,
    syriac,
    tagalog,
    tagbanwa,
    tai_le,
    tai_tham,
    tai_viet,
    tai_yo,
    takri,
    tamil,
    tangsa,
    tangut,
    telugu,
    thaana,
    thai,
    tibetan,
    tifinagh,
    tirhuta,
    todhri,
    tolong_siki,
    toto,
    tulu_tigalari,
    ugaritic,
    vai,
    vithkuqi,
    wancho,
    warang_citi,
    yezidi,
    yi,
    zanabazar_square,
};

pub const JoiningType = enum(u3) {
    non_joining,
    join_causing,
    dual_joining,
    right_joining,
    left_joining,
    transparent,
};

pub const JoiningGroup = enum(u7) {
    no_joining_group,
    african_feh,
    african_noon,
    african_qaf,
    ain,
    alaph,
    alef,
    beh,
    beth,
    burushaski_yeh_barree,
    dal,
    dalath_rish,
    e,
    farsi_yeh,
    fe,
    feh,
    final_semkath,
    gaf,
    gamal,
    hah,
    hanifi_rohingya_kinna_ya,
    hanifi_rohingya_pa,
    he,
    heh,
    heh_goal,
    heth,
    kaf,
    kaph,
    kashmiri_yeh,
    khaph,
    knotted_heh,
    lam,
    lamadh,
    malayalam_bha,
    malayalam_ja,
    malayalam_lla,
    malayalam_llla,
    malayalam_nga,
    malayalam_nna,
    malayalam_nnna,
    malayalam_nya,
    malayalam_ra,
    malayalam_ssa,
    malayalam_tta,
    manichaean_aleph,
    manichaean_ayin,
    manichaean_beth,
    manichaean_daleth,
    manichaean_dhamedh,
    manichaean_five,
    manichaean_gimel,
    manichaean_heth,
    manichaean_hundred,
    manichaean_kaph,
    manichaean_lamedh,
    manichaean_mem,
    manichaean_nun,
    manichaean_one,
    manichaean_pe,
    manichaean_qoph,
    manichaean_resh,
    manichaean_sadhe,
    manichaean_samekh,
    manichaean_taw,
    manichaean_ten,
    manichaean_teth,
    manichaean_thamedh,
    manichaean_twenty,
    manichaean_waw,
    manichaean_yodh,
    manichaean_zayin,
    meem,
    mim,
    noon,
    nun,
    nya,
    pe,
    qaf,
    qaph,
    reh,
    reversed_pe,
    rohingya_yeh,
    sad,
    sadhe,
    seen,
    semkath,
    shin,
    straight_waw,
    swash_kaf,
    syriac_waw,
    tah,
    taw,
    teh_marbuta,
    teh_marbuta_goal,
    teth,
    thin_noon,
    thin_yeh,
    vertical_tail,
    waw,
    yeh,
    yeh_barree,
    yeh_with_tail,
    yudh,
    yudh_he,
    zain,
    zhain,
};

pub const IndicPositionalCategory = enum(u4) {
    not_applicable,
    right,
    left,
    visual_order_left,
    left_and_right,
    top,
    bottom,
    top_and_bottom,
    top_and_right,
    top_and_left,
    top_and_left_and_right,
    bottom_and_right,
    bottom_and_left,
    top_and_bottom_and_right,
    top_and_bottom_and_left,
    overstruck,
};

pub const IndicSyllabicCategory = enum(u6) {
    other,
    bindu,
    visarga,
    avagraha,
    nukta,
    virama,
    pure_killer,
    reordering_killer,
    invisible_stacker,
    vowel_independent,
    vowel_dependent,
    vowel,
    consonant_placeholder,
    consonant,
    consonant_dead,
    consonant_with_stacker,
    consonant_prefixed,
    consonant_preceding_repha,
    consonant_initial_postfixed,
    consonant_succeeding_repha,
    consonant_subjoined,
    consonant_medial,
    consonant_final,
    consonant_head_letter,
    modifying_letter,
    tone_letter,
    tone_mark,
    gemination_mark,
    cantillation_mark,
    register_shifter,
    syllable_modifier,
    consonant_killer,
    non_joiner,
    joiner,
    number_joiner,
    number,
    brahmi_joining_number,
};
