" Taken from https://github.com/sdiehl/vim-cabalfmt

if !exists("g:cabalfmt_command")
  let g:cabalfmt_command = "cabal-fmt"
endif

if !exists("g:cabalfmt_options")
  let g:cabalfmt_options = [""]
endif

function! s:OverwriteBuffer(output)
  if &modifiable
    let l:curw = winsaveview()
    try | silent undojoin | catch | endtry
    let splitted = split(a:output, '\n')
    if line('$') > len(splitted)
      execute len(splitted) .',$delete'
    endif
    call setline(1, splitted)
    call winrestview(l:curw)
  else
    echom "Cannot write to non-modifiable buffer"
  endif
endfunction

function! s:RunCabal()
  if exists("bufname")
    let output = system(g:cabalfmt_command . " " . join(g:cabalfmt_options, ' ') . " " . bufname("%"))
  else
    let stdin = join(getline(1, '$'), "\n")
    let output = system(g:cabalfmt_command . " " . join(g:cabalfmt_options, ' '), stdin)
  endif
  if v:shell_error != 0
    echom output
  else
    call s:OverwriteBuffer(output)
    if exists("bufname")
      write
    endif
  endif
endfunction

function! s:CabalHaskell()
  if executable(g:cabalfmt_command)
    call s:RunCabal()
  else
    echom "cabal-fmt executable not found"
  endif
endfunction

function! RunCabal()
  call s:CabalHaskell()
endfunction

nnoremap <buffer> <silent> gq :call RunCabal()<CR>
