Skip to content

Instantly share code, notes, and snippets.

@emonkak
Created September 1, 2011 02:30
Show Gist options
  • Save emonkak/1185303 to your computer and use it in GitHub Desktop.
Save emonkak/1185303 to your computer and use it in GitHub Desktop.
functional.vim
function! s:foldl(F, Z, XS)
let wrapper = {'F': a:F}
function wrapper.go(Z, XS) dict
if empty(a:XS)
return a:Z
else
let [X; XS] = a:XS
return self.go(self.F(a:Z, X), XS)
endif
endfunction
return wrapper.go(a:Z, a:XS)
endfunction
function! s:succ(X)
return a:X + 1
endfunction
function! s:step_sum(Z, X)
return a:Z + a:X
endfunction
function! s:sum(xs)
return s:foldl(function('s:step_sum'), 0, a:xs)
endfunction
function! s:step_combine(Z, X)
return a:X(a:Z)
endfunction
function! s:combine(...)
return s:foldl(function('s:step_combine'), a:000[-1], a:000[:-2])
endfunction
echo s:sum(range(0, 10))
echo s:combine(function('char2nr'), function('s:succ'), function('nr2char'), 'A')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment