(.require
 [library
  [lux (.except)
   ["$" documentation]
   [data
    ["[0]" text (.only)
     ["%" \\format (.only format)]]
    [collection
     ["[0]" list (.use "[1]#[0]" monoid)]]]
   [math
    [number
     ["[0]" nat (.use "hex#[0]" hex)]]]]]
 [\\library
  ["[0]" /]])

(def description
  (template (_ <name>)
    [($.definition <name>
       (let [[_ name] (symbol <name>)]
         (format (hex#encoded (/.start <name>))
                 "-" (hex#encoded (/.end <name>))
                 " | " (text.replaced "_" " " name))))]))

(`` (def all_1/4
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  [/.basic_latin]
                  [/.latin_1_supplement]
                  [/.latin_extended_a]
                  [/.latin_extended_b]
                  [/.ipa_extensions]
                  [/.spacing_modifier_letters]
                  [/.combining_diacritical_marks]
                  [/.greek_and_coptic]
                  [/.cyrillic]
                  [/.cyrillic_supplementary]
                  [/.armenian]
                  [/.hebrew]
                  [/.arabic]
                  [/.syriac]
                  [/.thaana]
                  [/.devanagari]
                  [/.bengali]
                  [/.gurmukhi]
                  [/.gujarati]
                  [/.oriya]
                  [/.tamil]
                  [/.telugu]
                  [/.kannada]
                  [/.malayalam]
                  [/.sinhala]
                  [/.thai]
                  [/.lao]
                  [/.tibetan]
                  [/.myanmar]
                  [/.georgian]
                  [/.hangul_jamo]
                  [/.ethiopic]
                  [/.cherokee]
                  ))
            )))

(`` (def all_2/4
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  [/.unified_canadian_aboriginal_syllabics]
                  [/.ogham]
                  [/.runic]
                  [/.tagalog]
                  [/.hanunoo]
                  [/.buhid]
                  [/.tagbanwa]
                  [/.khmer]
                  [/.mongolian]
                  [/.limbu]
                  [/.tai_le]
                  [/.khmer_symbols]
                  [/.phonetic_extensions]
                  [/.latin_extended_additional]
                  [/.greek_extended]
                  [/.general_punctuation]
                  [/.superscripts_and_subscripts]
                  [/.currency_symbols]
                  [/.combining_diacritical_marks_for_symbols]
                  ))
            )))

(`` (def all_3/4
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  [/.combining_diacritical_marks_for_symbols]
                  [/.letterlike_symbols]
                  [/.number_forms]
                  [/.arrows]
                  [/.mathematical_operators]
                  [/.miscellaneous_technical]
                  [/.control_pictures]
                  [/.optical_character_recognition]
                  [/.enclosed_alphanumerics]
                  [/.box_drawing]
                  [/.block_elements]
                  [/.geometric_shapes]
                  [/.miscellaneous_symbols]
                  [/.dingbats]
                  [/.miscellaneous_mathematical_symbols_a]
                  [/.supplemental_arrows_a]
                  [/.braille_patterns]
                  [/.supplemental_arrows_b]
                  [/.miscellaneous_mathematical_symbols_b]
                  [/.supplemental_mathematical_operators]
                  [/.miscellaneous_symbols_and_arrows]
                  [/.cjk_radicals_supplement]
                  [/.kangxi_radicals]
                  [/.ideographic_description_characters]
                  [/.cjk_symbols_and_punctuation]
                  [/.hiragana]
                  [/.katakana]
                  [/.bopomofo]
                  ))
            )))

(`` (def all_4/4
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  [/.hangul_compatibility_jamo]
                  [/.kanbun]
                  [/.bopomofo_extended]
                  [/.katakana_phonetic_extensions]
                  [/.enclosed_cjk_letters_and_months]
                  [/.cjk_compatibility]
                  [/.cjk_unified_ideographs_extension_a]
                  [/.yijing_hexagram_symbols]
                  [/.cjk_unified_ideographs]
                  [/.yi_syllables]
                  [/.yi_radicals]
                  [/.hangul_syllables]
                  [/.high_surrogates]
                  [/.high_private_use_surrogates]
                  [/.low_surrogates]
                  [/.private_use_area]
                  [/.cjk_compatibility_ideographs]
                  [/.alphabetic_presentation_forms]
                  [/.arabic_presentation_forms_a]
                  [/.variation_selectors]
                  [/.combining_half_marks]
                  [/.cjk_compatibility_forms]
                  [/.small_form_variants]
                  [/.arabic_presentation_forms_b]
                  [/.halfwidth_and_fullwidth_forms]
                  [/.specials]
                  [/.numeric]
                  [/.upper_case]
                  [/.lower_case]
                  ))
            )))

(def .public documentation
  (List $.Documentation)
  (list.partial ($.module /._
                          "")

                ($.definition /.monoid)
                ($.definition /.start)
                ($.definition /.end)
                ($.definition /.size)
                ($.definition /.equivalence)
                ($.definition /.hash)

                ($.definition /.Block
                  "A block of valid unicode characters.")

                ($.definition /.block
                  ""
                  [(block start additional)])

                ($.definition /.within?
                  ""
                  [(within? block char)])

                (all list#composite
                     all_1/4
                     all_2/4
                     all_3/4
                     all_4/4
                     )
                ))
