dotfiles/vim/plugins/GoldenView/autoload/GoldenView/zl/list.vim
2018-04-05 13:06:54 +02:00

127 lines
3.6 KiB
VimL

" =============== ============================================================
" Synopsis : list helper functions
" Author : Zhao Cai <caizhaoff@gmail.com>
" HomePage : https://github.com/zhaocai/zl.vim
" Version : 0.1
" Date Created : Sat 03 Sep 2011 03:54:00 PM EDT
" Last Modified : Thu 20 Sep 2012 04:25:10 PM EDT
" Tag : [ vim, list ]
" Copyright : (c) 2012 by Zhao Cai,
" Released under current GPL license.
" =============== ============================================================
" ============================================================================
" Sort: ⟨⟨⟨1
" ============================================================================
function! GoldenView#zl#list#unique_sort(list, ...)
"--------- ------------------------------------------------
" Args : list, [func]
" Return : unique sorted list
" Raise :
"
" Refer : http://vim.wikia.com/wiki/Unique_sorting
"--------- ------------------------------------------------
let list = copy(a:list)
if exists('a:1') && type(a:1) == type(function('function'))
call sort(list, a:1)
else
call sort(list)
endif
if len(list) <= 1 | return list | endif
let result = [ list[0] ]
let last = list[0]
let i = 1
while i < len(list)
if last != list[i]
let last = list[i]
call add(result, last)
endif
let i += 1
endwhile
return result
endfunction
function! GoldenView#zl#list#sort_by(list, expr)
"--------- ------------------------------------------------
" Desc : sort list by expr
"
" Args : v:val is used in {expr}
" Return : sroted list
" Raise :
"
" Example : >
" let list = [{'a' : 1}, {'a' : 22}, {'a' : 3}]
" echo GoldenView#zl#list#sort_by(list, 'v:val["a"]')
"
" Refer : vital.vim
"--------- ------------------------------------------------
let pairs = map(a:list, printf('[v:val, %s]', a:expr))
return map(GoldenView#zl#list#sort(pairs,
\ 'a:a[1] ==# a:b[1] ? 0 : a:a[1] ># a:b[1] ? 1 : -1'),
\ 'v:val[0]')
endfunction
function! s:_compare(a, b)
return eval(s:expr)
endfunction
function! GoldenView#zl#list#sort(list, expr)
"--------- ------------------------------------------------
" Desc : sort list with expr to compare two values.
"
" Args : a:a and a:b can be used in {expr}
" Return : sroted list
" Raise :
"
" Refer : vital.vim
"--------- ------------------------------------------------
if type(a:expr) == type(function('function'))
return sort(a:list, a:expr)
endif
let s:expr = a:expr
return sort(a:list, 's:_compare')
endfunction
function! GoldenView#zl#list#uniq(list, ...)
let list = a:0
\ ? map(copy(a:list), printf('[v:val, %s]', a:1))
\ : copy(a:list)
let i = 0
let seen = {}
while i < len(list)
let key = string(a:0 ? list[i][1] : list[i])
if has_key(seen, key)
call remove(list, i)
else
let seen[key] = 1
let i += 1
endif
endwhile
return a:0 ? map(list, 'v:val[0]') : list
endfunction
" ============================================================================
" Modeline: ⟨⟨⟨1
" ============================================================================
" vim: set ft=vim ts=4 sw=4 tw=78 fdm=marker fmr=⟨⟨⟨,⟩⟩⟩ fdl=1 :