module Cornelis.Debug where

import Control.Exception (catch, throw)
import Control.Monad.IO.Class
import System.IO.Error (isAlreadyInUseError)
import Neovim
import Neovim.API.String (vim_report_error)


reportExceptions :: Neovim env () -> Neovim env ()
reportExceptions :: forall env. Neovim env () -> Neovim env ()
reportExceptions =
  (Neovim env ()
 -> (NeovimException -> Neovim env ()) -> Neovim env ())
-> (NeovimException -> Neovim env ())
-> Neovim env ()
-> Neovim env ()
forall a b c. (a -> b -> c) -> b -> a -> c
flip Neovim env ()
-> (NeovimException -> Neovim env ()) -> Neovim env ()
forall (io :: * -> *) a.
MonadUnliftIO io =>
io a -> (NeovimException -> io a) -> io a
catchNeovimException ((NeovimException -> Neovim env ())
 -> Neovim env () -> Neovim env ())
-> (NeovimException -> Neovim env ())
-> Neovim env ()
-> Neovim env ()
forall a b. (a -> b) -> a -> b
$ String -> Neovim env ()
forall env. String -> Neovim env ()
vim_report_error (String -> Neovim env ())
-> (NeovimException -> String) -> NeovimException -> Neovim env ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
forall a. Monoid a => a -> a -> a
mappend String
"UNHANDLED EXCEPTION " (String -> String)
-> (NeovimException -> String) -> NeovimException -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NeovimException -> String
forall a. Show a => a -> String
show

traceMX :: Show a => String -> a -> Neovim env ()
traceMX :: forall a env. Show a => String -> a -> Neovim env ()
traceMX String
herald a
a =
  String -> Neovim env ()
forall env. String -> Neovim env ()
vim_report_error (String -> Neovim env ()) -> String -> Neovim env ()
forall a b. (a -> b) -> a -> b
$ String
"!!!" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
herald String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
": " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> a -> String
forall a. Show a => a -> String
show a
a

debug :: (Show a, MonadIO m) => a -> m ()
debug :: forall a (m :: * -> *). (Show a, MonadIO m) => a -> m ()
debug a
x = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> IO ()
go Int
100
  where
    go :: Int -> IO ()
go Int
0 = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    go Int
n =
      IO () -> (IOError -> IO ()) -> IO ()
forall e a. Exception e => IO a -> (e -> IO a) -> IO a
catch
       (String -> String -> IO ()
appendFile  String
"/tmp/agda.log" (a -> String
forall a. Show a => a -> String
show a
x String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\n"))
       (\IOError
e -> if IOError -> Bool
isAlreadyInUseError IOError
e then Int -> IO ()
go (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1 :: Int) else IOError -> IO ()
forall a e. Exception e => e -> a
throw IOError
e)