let s:invalid = 0
let s:empty = 1
let s:nonempty = 2
function! targets#state#new(state)
return {
\ 'state': a:state,
\
\ 'isInvalid': function('targets#state#isInvalid'),
\ 'isEmpty': function('targets#state#isEmpty'),
\ 'isNonempty': function('targets#state#isNonempty'),
\ 'isValid': function('targets#state#isValid'),
\ 'isInvalidOrEmpty': function('targets#state#isInvalidOrEmpty'),
\ }
endfunction
" constructors
function! targets#state#invalid()
return targets#state#new(s:invalid)
endfunction
function! targets#state#nonempty()
return targets#state#new(s:nonempty)
endfunction
function! targets#state#empty()
return targets#state#new(s:empty)
endfunction
" raw attributes
function! targets#state#isInvalid() dict
return self.state == s:invalid
endfunction
function! targets#state#isEmpty() dict
return self.state == s:empty
endfunction
function! targets#state#isNonempty() dict
return self.state == s:nonempty
endfunction
" derived attributes
" empty or nonempty
function! targets#state#isValid() dict
return self.state != s:invalid
endfunction
function! targets#state#isInvalidOrEmpty() dict
return self.state != s:nonempty
endfunction