1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-03 22:50:05 +08:00
SpaceVim/bundle/gina.vim/autoload/vital/_gina/App/Emitter.vim

79 lines
2.4 KiB
VimL

" ___vital___
" NOTE: lines between '" ___vital___' is generated by :Vitalize.
" Do not modify the code nor insert new lines before '" ___vital___'
function! s:_SID() abort
return matchstr(expand('<sfile>'), '<SNR>\zs\d\+\ze__SID$')
endfunction
execute join(['function! vital#_gina#App#Emitter#import() abort', printf("return map({'subscribe': '', 'unsubscribe': '', 'emit': '', 'add_middleware': '', 'remove_middleware': ''}, \"vital#_gina#function('<SNR>%s_' . v:key)\")", s:_SID()), 'endfunction'], "\n")
delfunction s:_SID
" ___vital___
let s:listeners = {}
let s:middlewares = []
function! s:subscribe(name, listener, ...) abort
let dict = get(a:000, 0, v:null)
let s:listeners[a:name] = get(s:listeners, a:name, [])
call add(s:listeners[a:name], [a:listener, dict])
endfunction
function! s:unsubscribe(...) abort
if a:0 == 0
let s:listeners = {}
elseif a:0 == 1
let s:listeners[a:1] = []
else
let dict = a:0 == 3 ? a:3 : v:null
let s:listeners[a:1] = get(s:listeners, a:1, [])
let index = index(s:listeners[a:1], [a:2, dict])
if index != -1
call remove(s:listeners[a:1], index)
endif
endif
endfunction
function! s:add_middleware(middleware) abort
call add(s:middlewares, a:middleware)
endfunction
function! s:remove_middleware(...) abort
if a:0 == 0
let s:middlewares = []
else
let index = index(s:middlewares, a:1)
if index != -1
call remove(s:middlewares, index)
endif
endif
endfunction
function! s:emit(name, ...) abort
let attrs = copy(a:000)
let listeners = copy(get(s:listeners, a:name, []))
let middlewares = map(s:middlewares, 'extend(copy(s:middleware), v:val)')
for middleware in middlewares
call call(middleware.on_emit_pre, [a:name, listeners, attrs], middleware)
endfor
for [l:Listener, dict] in listeners
if empty(dict)
call call(Listener, attrs)
else
call call(Listener, attrs, dict)
endif
endfor
for middleware in middlewares
call call(middleware.on_emit_post, [a:name, listeners, attrs], middleware)
endfor
endfunction
" Middleware skeleton --------------------------------------------------------
let s:middleware = {}
function! s:middleware.on_emit_pre(name, listeners, attrs) abort
" Users can override this method
endfunction
function! s:middleware.on_emit_post(name, listeners, attrs) abort
" Users can override this method
endfunction