{-# LANGUAGE FlexibleInstances , UndecidableInstances , TypeFamilies , FlexibleContexts #-} module UnescapingPrint (unEscapingShow, ushow, unEscapingPrint, uprint) where import Prelude(Char, String, IO, putStrLn, ShowS, showString,(.),map,(>)) import GHC.Show (Show(..), showLitChar, showChar) import Unsafe.Coerce (unsafeCoerce) newtype UnescapingChar = UnescapingChar {unescapingChar :: Char} type family ToUnescapingTF a where ToUnescapingTF Char = UnescapingChar ToUnescapingTF (x a b c d e f g h) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) (ToUnescapingTF d) (ToUnescapingTF e) (ToUnescapingTF f) (ToUnescapingTF g) (ToUnescapingTF h) ToUnescapingTF (x a b c d e f g) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) (ToUnescapingTF d) (ToUnescapingTF e) (ToUnescapingTF f) (ToUnescapingTF g) ToUnescapingTF (x a b c d e f) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) (ToUnescapingTF d) (ToUnescapingTF e) (ToUnescapingTF f) ToUnescapingTF (x a b c d e) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) (ToUnescapingTF d) (ToUnescapingTF e) ToUnescapingTF (x a b c d) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) (ToUnescapingTF d) ToUnescapingTF (x a b c) = x (ToUnescapingTF a) (ToUnescapingTF b) (ToUnescapingTF c) ToUnescapingTF (x a b) = x (ToUnescapingTF a) (ToUnescapingTF b) ToUnescapingTF (x a) = x (ToUnescapingTF a) ToUnescapingTF a = a class Show a => ToUnescaping a where toUnescaping :: a -> ToUnescapingTF a instance ToUnescaping Char where toUnescaping = UnescapingChar instance Show a => ToUnescaping a where toUnescaping = unsafeCoerce unEscapingShow, ushow :: (ToUnescaping t, Show (ToUnescapingTF t)) => t -> String unEscapingShow = show . toUnescaping ushow = unEscapingShow unEscapingPrint, uprint :: (ToUnescaping t, Show (ToUnescapingTF t)) => t -> IO () unEscapingPrint = putStrLn . unEscapingShow uprint = unEscapingPrint -------------------------------------------------------------------------- instance Show UnescapingChar where showsPrec _ (UnescapingChar '\'') = showString "'\\''" showsPrec _ (UnescapingChar c) = showChar '\'' . showLitChar' c . showChar '\'' showList cs = showChar '"' . showLitString' (map unescapingChar cs) . showChar '"' showLitChar' :: Char -> ShowS showLitChar' c s | c > '\DEL' = showChar c s showLitChar' c s = showLitChar c s showLitString' :: String -> ShowS showLitString' [] s = s showLitString' ('"' : cs) s = showString "\\\"" (showLitString' cs s) showLitString' (c : cs) s = showLitChar' c (showLitString' cs s)