{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE TypeFamilies #-}
import Control.Monad (Monad(..), mapM)
import Data.Bool
+import Data.Eq (Eq(..))
import Data.Foldable (toList, null)
-import Data.Function (($), (.))
+import Data.Function (($), (.), id)
import Data.Int (Int)
import Data.List.NonEmpty (NonEmpty(..))
import Data.Maybe (Maybe(..))
import qualified Control.Monad.Trans.Reader as R
import qualified Data.List as List
import qualified Data.Text.Lazy as TL
+import qualified Debug.Trace as Trace
import qualified Text.Megaparsec as P
-- * Debug
#if DEBUG
-import qualified Debug.Trace as Trace
debug :: String -> a -> a
debug = Trace.trace
debug0 :: Pretty a => String -> a -> a
-debug0 m a = Trace.trace (m <> ": " <> R.runReader (pretty a) 2) a
+debug0 m a = Trace.trace (m <> ": " <> runPretty 2 a) a
debug1 :: (Pretty r, Pretty a) => String -> String -> (a -> r) -> (a -> r)
debug1 nf na f a =
- (\r -> Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) r) $
- (Trace.trace ("[ " <> nf <> ":\n " <> na <> " = " <> R.runReader (pretty a) 2) f)
+ (\r -> Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) r) $
+ Trace.trace ("[ " <> nf <> ":\n " <> na <> " = " <> runPretty 2 a) f
a
debug1_ :: (Pretty r, Pretty a) => String -> (String,a) -> r -> r
debug1_ nf (na,a) r =
- Trace.trace ("[ " <> nf <> ":\n " <> na <> " = " <> R.runReader (pretty a) 2) $
- Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) $
+ Trace.trace ("[ " <> nf <> ":\n " <> na <> " = " <> runPretty 2 a) $
+ Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) $
r
debug2 :: (Pretty r, Pretty a, Pretty b) => String -> String -> String -> (a -> b -> r) -> (a -> b -> r)
debug2 nf na nb f a b =
- (\r -> Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) r) $
+ (\r -> Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) r) $
Trace.trace
("[ " <> nf <> ":"
- <> "\n " <> na <> " = " <> R.runReader (pretty a) 2
- <> "\n " <> nb <> " = " <> R.runReader (pretty b) 2
+ <> "\n " <> na <> " = " <> runPretty 2 a
+ <> "\n " <> nb <> " = " <> runPretty 2 b
) f a b
debug2_ :: (Pretty r, Pretty a, Pretty b) => String -> (String,a) -> (String,b) -> r -> r
debug2_ nf (na,a) (nb,b) r =
Trace.trace
("[ " <> nf <> ":"
- <> "\n " <> na <> " = " <> R.runReader (pretty a) 2
- <> "\n " <> nb <> " = " <> R.runReader (pretty b) 2
+ <> "\n " <> na <> " = " <> runPretty 2 a
+ <> "\n " <> nb <> " = " <> runPretty 2 b
) $
- Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) $
+ Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) $
r
debug3 :: (Pretty r, Pretty a, Pretty b, Pretty c) => String -> String -> String -> String -> (a -> b -> c -> r) -> (a -> b -> c -> r)
debug3 nf na nb nc f a b c =
- (\r -> Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) r) $
+ (\r -> Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) r) $
Trace.trace
("[ " <> nf <> ":"
- <> "\n " <> na <> " = " <> R.runReader (pretty a) 2
- <> "\n " <> nb <> " = " <> R.runReader (pretty b) 2
- <> "\n " <> nc <> " = " <> R.runReader (pretty c) 2
+ <> "\n " <> na <> " = " <> runPretty 2 a
+ <> "\n " <> nb <> " = " <> runPretty 2 b
+ <> "\n " <> nc <> " = " <> runPretty 2 c
) f a b c
debug3_ :: (Pretty r, Pretty a, Pretty b, Pretty c) => String -> (String,a) -> (String,b) -> (String,c) -> r -> r
debug3_ nf (na,a) (nb,b) (nc,c) r =
Trace.trace
("[ " <> nf <> ":"
- <> "\n " <> na <> " = " <> R.runReader (pretty a) 2
- <> "\n " <> nb <> " = " <> R.runReader (pretty b) 2
- <> "\n " <> nc <> " = " <> R.runReader (pretty c) 2
+ <> "\n " <> na <> " = " <> runPretty 2 a
+ <> "\n " <> nb <> " = " <> runPretty 2 b
+ <> "\n " <> nc <> " = " <> runPretty 2 c
) $
- Trace.trace ("] " <> nf <> ": " <> R.runReader (pretty r) 2) $
+ Trace.trace ("] " <> nf <> ": " <> runPretty 2 r) $
r
debugParser ::
String -> P.Parsec e s a -> P.Parsec e s a
debugParser = P.dbg
#else
-import Data.Function (id)
debug :: String -> a -> a
debug _m = id
pretty :: a -> R.Reader Int String
default pretty :: Show a => a -> R.Reader Int String
pretty = return . show
+
+runPretty :: Pretty a => Int -> a -> String
+runPretty i a = pretty a `R.runReader` i
+
instance Pretty Bool
instance Pretty Int
instance Pretty Text
instance Pretty TL.Text
+instance Pretty P.Pos
instance (Pretty a, Pretty b) => Pretty (a,b) where
pretty (a,b) = do
i <- R.ask
a' <- R.local (+2) $ pretty a
b' <- R.local (+2) $ pretty b
return $
- "\n" <> List.replicate i ' ' <> "( " <> a' <>
+ (if i == 0 then "" else "\n") <>
+ List.replicate i ' ' <> "( " <> a' <>
"\n" <> List.replicate i ' ' <> ", " <> b' <>
"\n" <> List.replicate i ' ' <> ") "
instance Pretty a => Pretty [a] where
i <- R.ask
s <- R.local (+2) $ mapM pretty as
return $
- "\n" <> List.replicate i ' ' <> "[ " <>
+ (if i == 0 then "" else "\n") <>
+ List.replicate i ' ' <> "[ " <>
List.intercalate ("\n" <> List.replicate i ' ' <> ", ") s <>
"\n" <> List.replicate i ' ' <> "] "
instance Pretty a => Pretty (NonEmpty a) where
i <- R.ask
s <- R.local (+2) $ mapM pretty as
return $
- "\n" <> List.replicate i ' ' <> "[ " <>
+ (if i == 0 then "" else "\n") <>
+ List.replicate i ' ' <> "[ " <>
List.intercalate ("\n" <> List.replicate i ' ' <> ", ") s <>
"\n" <> List.replicate i ' ' <> "] "
instance Pretty a => Pretty (Maybe a) where