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)