override fun doFunction()

in vim-engine/src/main/kotlin/com/maddyhome/idea/vim/vimscript/model/functions/handlers/collectionFunctions/CountFunctionHandler.kt [24:74]


  override fun doFunction(
    arguments: Arguments,
    editor: VimEditor,
    context: ExecutionContext,
    vimContext: VimLContext,
  ): VimInt {
    val comp = arguments[0]
    val expr = arguments[1]
    val ic = arguments.getNumberOrNull(2)?.booleanValue ?: false
    val start = arguments.getNumberOrNull(3)?.value ?: 0

    return when (comp) {
      is VimString -> {
        // Count non-overlapping occurrences in string
        val text = comp.value
        val pattern = expr.toVimString().value
        if (pattern.isEmpty()) {
          return VimInt(0)
        }
        var count = 0
        var index = 0
        while (index <= text.length - pattern.length) {
          val substring = text.substring(index, index + pattern.length)
          val matches = if (ic) {
            substring.equals(pattern, ignoreCase = true)
          } else {
            substring == pattern
          }
          if (matches) {
            count++
            index += pattern.length // Non-overlapping
          } else {
            index++
          }
        }
        VimInt(count)
      }

      is VimList -> {
        val items = if (start > 0 && start < comp.values.size) {
          comp.values.subList(start, comp.values.size)
        } else {
          comp.values
        }
        items.count { item -> item.valueEquals(expr, ic) }.asVimInt()
      }

      is VimDictionary -> comp.dictionary.values.count { item -> item.valueEquals(expr, ic) }.asVimInt()
      else -> VimInt.ZERO
    }
  }