# File lib/active_support/multibyte/chars.rb, line 551
        def compose_codepoints(codepoints)
          pos = 0
          eoa = codepoints.length - 1
          starter_pos = 0
          starter_char = codepoints[0]
          previous_combining_class = -1
          while pos < eoa
            pos += 1
            lindex = starter_char - HANGUL_LBASE
            # -- Hangul
            if 0 <= lindex and lindex < HANGUL_LCOUNT
              vindex = codepoints[starter_pos+1] - HANGUL_VBASE rescue vindex = -1
              if 0 <= vindex and vindex < HANGUL_VCOUNT
                tindex = codepoints[starter_pos+2] - HANGUL_TBASE rescue tindex = -1
                if 0 <= tindex and tindex < HANGUL_TCOUNT
                  j = starter_pos + 2
                  eoa -= 2
                else
                  tindex = 0
                  j = starter_pos + 1
                  eoa -= 1
                end
                codepoints[starter_pos..j] = (lindex * HANGUL_VCOUNT + vindex) * HANGUL_TCOUNT + tindex + HANGUL_SBASE
              end
              starter_pos += 1
              starter_char = codepoints[starter_pos]
            # -- Other characters
            else
              current_char = codepoints[pos]
              current = UCD.codepoints[current_char]
              if current.combining_class > previous_combining_class
                if ref = UCD.composition_map[starter_char]
                  composition = ref[current_char]
                else
                  composition = nil
                end
                unless composition.nil?
                  codepoints[starter_pos] = composition
                  starter_char = composition
                  codepoints.delete_at pos
                  eoa -= 1
                  pos -= 1
                  previous_combining_class = -1
                else
                  previous_combining_class = current.combining_class
                end
              else
                previous_combining_class = current.combining_class
              end
              if current.combining_class == 0
                starter_pos = pos
                starter_char = codepoints[pos]
              end
            end
          end
          codepoints
        end