// Unicode 15.0.0 General_Category=P*, generated from Python unicodedata.
// Unicode License V3: third_party/licenses/Unicode-LICENSE.txt.

///|
let document_unicode_punctuation_ranges : Array[(Int, Int)] = [
  (0xA1, 0xA1),
  (0xA7, 0xA7),
  (0xAB, 0xAB),
  (0xB6, 0xB7),
  (0xBB, 0xBB),
  (0xBF, 0xBF),
  (0x37E, 0x37E),
  (0x387, 0x387),
  (0x55A, 0x55F),
  (0x589, 0x58A),
  (0x5BE, 0x5BE),
  (0x5C0, 0x5C0),
  (0x5C3, 0x5C3),
  (0x5C6, 0x5C6),
  (0x5F3, 0x5F4),
  (0x609, 0x60A),
  (0x60C, 0x60D),
  (0x61B, 0x61B),
  (0x61D, 0x61F),
  (0x66A, 0x66D),
  (0x6D4, 0x6D4),
  (0x700, 0x70D),
  (0x7F7, 0x7F9),
  (0x830, 0x83E),
  (0x85E, 0x85E),
  (0x964, 0x965),
  (0x970, 0x970),
  (0x9FD, 0x9FD),
  (0xA76, 0xA76),
  (0xAF0, 0xAF0),
  (0xC77, 0xC77),
  (0xC84, 0xC84),
  (0xDF4, 0xDF4),
  (0xE4F, 0xE4F),
  (0xE5A, 0xE5B),
  (0xF04, 0xF12),
  (0xF14, 0xF14),
  (0xF3A, 0xF3D),
  (0xF85, 0xF85),
  (0xFD0, 0xFD4),
  (0xFD9, 0xFDA),
  (0x104A, 0x104F),
  (0x10FB, 0x10FB),
  (0x1360, 0x1368),
  (0x1400, 0x1400),
  (0x166E, 0x166E),
  (0x169B, 0x169C),
  (0x16EB, 0x16ED),
  (0x1735, 0x1736),
  (0x17D4, 0x17D6),
  (0x17D8, 0x17DA),
  (0x1800, 0x180A),
  (0x1944, 0x1945),
  (0x1A1E, 0x1A1F),
  (0x1AA0, 0x1AA6),
  (0x1AA8, 0x1AAD),
  (0x1B5A, 0x1B60),
  (0x1B7D, 0x1B7E),
  (0x1BFC, 0x1BFF),
  (0x1C3B, 0x1C3F),
  (0x1C7E, 0x1C7F),
  (0x1CC0, 0x1CC7),
  (0x1CD3, 0x1CD3),
  (0x2010, 0x2027),
  (0x2030, 0x2043),
  (0x2045, 0x2051),
  (0x2053, 0x205E),
  (0x207D, 0x207E),
  (0x208D, 0x208E),
  (0x2308, 0x230B),
  (0x2329, 0x232A),
  (0x2768, 0x2775),
  (0x27C5, 0x27C6),
  (0x27E6, 0x27EF),
  (0x2983, 0x2998),
  (0x29D8, 0x29DB),
  (0x29FC, 0x29FD),
  (0x2CF9, 0x2CFC),
  (0x2CFE, 0x2CFF),
  (0x2D70, 0x2D70),
  (0x2E00, 0x2E2E),
  (0x2E30, 0x2E4F),
  (0x2E52, 0x2E5D),
  (0x3001, 0x3003),
  (0x3008, 0x3011),
  (0x3014, 0x301F),
  (0x3030, 0x3030),
  (0x303D, 0x303D),
  (0x30A0, 0x30A0),
  (0x30FB, 0x30FB),
  (0xA4FE, 0xA4FF),
  (0xA60D, 0xA60F),
  (0xA673, 0xA673),
  (0xA67E, 0xA67E),
  (0xA6F2, 0xA6F7),
  (0xA874, 0xA877),
  (0xA8CE, 0xA8CF),
  (0xA8F8, 0xA8FA),
  (0xA8FC, 0xA8FC),
  (0xA92E, 0xA92F),
  (0xA95F, 0xA95F),
  (0xA9C1, 0xA9CD),
  (0xA9DE, 0xA9DF),
  (0xAA5C, 0xAA5F),
  (0xAADE, 0xAADF),
  (0xAAF0, 0xAAF1),
  (0xABEB, 0xABEB),
  (0xFD3E, 0xFD3F),
  (0xFE10, 0xFE19),
  (0xFE30, 0xFE52),
  (0xFE54, 0xFE61),
  (0xFE63, 0xFE63),
  (0xFE68, 0xFE68),
  (0xFE6A, 0xFE6B),
  (0xFF01, 0xFF03),
  (0xFF05, 0xFF0A),
  (0xFF0C, 0xFF0F),
  (0xFF1A, 0xFF1B),
  (0xFF1F, 0xFF20),
  (0xFF3B, 0xFF3D),
  (0xFF3F, 0xFF3F),
  (0xFF5B, 0xFF5B),
  (0xFF5D, 0xFF5D),
  (0xFF5F, 0xFF65),
  (0x10100, 0x10102),
  (0x1039F, 0x1039F),
  (0x103D0, 0x103D0),
  (0x1056F, 0x1056F),
  (0x10857, 0x10857),
  (0x1091F, 0x1091F),
  (0x1093F, 0x1093F),
  (0x10A50, 0x10A58),
  (0x10A7F, 0x10A7F),
  (0x10AF0, 0x10AF6),
  (0x10B39, 0x10B3F),
  (0x10B99, 0x10B9C),
  (0x10EAD, 0x10EAD),
  (0x10F55, 0x10F59),
  (0x10F86, 0x10F89),
  (0x11047, 0x1104D),
  (0x110BB, 0x110BC),
  (0x110BE, 0x110C1),
  (0x11140, 0x11143),
  (0x11174, 0x11175),
  (0x111C5, 0x111C8),
  (0x111CD, 0x111CD),
  (0x111DB, 0x111DB),
  (0x111DD, 0x111DF),
  (0x11238, 0x1123D),
  (0x112A9, 0x112A9),
  (0x1144B, 0x1144F),
  (0x1145A, 0x1145B),
  (0x1145D, 0x1145D),
  (0x114C6, 0x114C6),
  (0x115C1, 0x115D7),
  (0x11641, 0x11643),
  (0x11660, 0x1166C),
  (0x116B9, 0x116B9),
  (0x1173C, 0x1173E),
  (0x1183B, 0x1183B),
  (0x11944, 0x11946),
  (0x119E2, 0x119E2),
  (0x11A3F, 0x11A46),
  (0x11A9A, 0x11A9C),
  (0x11A9E, 0x11AA2),
  (0x11B00, 0x11B09),
  (0x11C41, 0x11C45),
  (0x11C70, 0x11C71),
  (0x11EF7, 0x11EF8),
  (0x11F43, 0x11F4F),
  (0x11FFF, 0x11FFF),
  (0x12470, 0x12474),
  (0x12FF1, 0x12FF2),
  (0x16A6E, 0x16A6F),
  (0x16AF5, 0x16AF5),
  (0x16B37, 0x16B3B),
  (0x16B44, 0x16B44),
  (0x16E97, 0x16E9A),
  (0x16FE2, 0x16FE2),
  (0x1BC9F, 0x1BC9F),
  (0x1DA87, 0x1DA8B),
  (0x1E95E, 0x1E95F),
]

///|
fn document_unicode_punctuation(ch : Char) -> Bool {
  let code = ch.to_int()
  let mut low = 0
  let mut high = document_unicode_punctuation_ranges.length()
  while low < high {
    let middle = (low + high) / 2
    let (start, end) = document_unicode_punctuation_ranges[middle]
    if code < start {
      high = middle
    } else if code > end {
      low = middle + 1
    } else {
      return true
    }
  }
  false
}