mirror of
https://github.com/inkarkat/vim-ingo-library.git
synced 2026-05-29 11:18:51 +02:00
123 lines
3.8 KiB
VimL
123 lines
3.8 KiB
VimL
" ingo/list/pattern.vim: Functions for applying a regular expression to List items.
|
|
"
|
|
" DEPENDENCIES:
|
|
"
|
|
" Copyright: (C) 2018 Ingo Karkat
|
|
" The VIM LICENSE applies to this script; see ':help copyright'.
|
|
"
|
|
" Maintainer: Ingo Karkat <ingo@karkat.de>
|
|
|
|
function! ingo#list#pattern#AllItemsMatch( list, pattern )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Test whether each item of the list matches the regular expression.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:list A list.
|
|
" a:pattern Regular expression.
|
|
"* RETURN VALUES:
|
|
" 1 if all items of a:list match a:pattern; else 0.
|
|
"******************************************************************************
|
|
return empty(filter(copy(a:list), 'v:val !~# a:pattern'))
|
|
endfunction
|
|
|
|
function! ingo#list#pattern#FirstMatchIndex( list, pattern )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Return the index of the first item in a:list that matches a:pattern, or -1.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:list A list.
|
|
" a:pattern Regular expression.
|
|
"* RETURN VALUES:
|
|
" Index of the first item that matches a:pattern, or -1 if no item matches.
|
|
"******************************************************************************
|
|
let l:i = 0
|
|
while l:i < len(a:list)
|
|
if a:list[l:i] =~# a:pattern
|
|
return l:i
|
|
endif
|
|
let l:i += 1
|
|
endwhile
|
|
return -1
|
|
endfunction
|
|
|
|
function! ingo#list#pattern#FirstMatch( list, pattern, ... )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Return the first item in a:list that matches a:pattern, or an empty String.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:list A list.
|
|
" a:pattern Regular expression.
|
|
" a:noMatchValue Optional value that is returned (instead of an empty String)
|
|
" if a:pattern does not match at all.
|
|
"* RETURN VALUES:
|
|
" First item that matches a:pattern, or '' (or a:noMatchValue).
|
|
"******************************************************************************
|
|
let l:i = ingo#list#pattern#FirstMatchIndex(a:list, a:pattern)
|
|
return (l:i == -1 ? (a:0 ? a:1 : '') : a:list[l:i])
|
|
endfunction
|
|
|
|
function! ingo#list#pattern#AllMatchIndices( list, pattern )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Return a List of indices of those items in a:list that match a:pattern.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:list A list.
|
|
" a:pattern Regular expression.
|
|
"* RETURN VALUES:
|
|
" (Possibly empty) List of (ascending) indices of matching items.
|
|
"******************************************************************************
|
|
let l:i = 0
|
|
let l:result = []
|
|
while l:i < len(a:list)
|
|
if a:list[l:i] =~# a:pattern
|
|
call add(l:result, l:i)
|
|
endif
|
|
let l:i += 1
|
|
endwhile
|
|
return l:result
|
|
endfunction
|
|
|
|
function! ingo#list#pattern#AllMatches( list, pattern )
|
|
"******************************************************************************
|
|
"* PURPOSE:
|
|
" Return a List of those items in a:list that match a:pattern.
|
|
"* ASSUMPTIONS / PRECONDITIONS:
|
|
" None.
|
|
"* EFFECTS / POSTCONDITIONS:
|
|
" None.
|
|
"* INPUTS:
|
|
" a:list A list.
|
|
" a:pattern Regular expression.
|
|
"* RETURN VALUES:
|
|
" (Possibly empty) List of matching items. The original a:list is left
|
|
" untouched.
|
|
"******************************************************************************
|
|
let l:i = 0
|
|
let l:result = []
|
|
while l:i < len(a:list)
|
|
if a:list[l:i] =~# a:pattern
|
|
call add(l:result, a:list[l:i])
|
|
endif
|
|
let l:i += 1
|
|
endwhile
|
|
return l:result
|
|
endfunction
|
|
|
|
" vim: set ts=8 sts=4 sw=4 noexpandtab ff=unix fdm=syntax :
|