generic-pretty-instances-0.1.0.0: src/Text/PrettyPrint/GenericPretty/Instance.hs
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Text.PrettyPrint.GenericPretty.Instance
(
)
where
import qualified Control.Exception as Exception
import qualified Crypto.Secp256k1 as Secp256k1
import Data.ByteString.Base16 as B16 (encode)
import qualified Data.CaseInsensitive as CI
import qualified Data.Fixed as Fixed
import qualified Data.ProtoLens.Runtime.Data.ProtoLens.Encoding.Wire as Wire
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Time.Calendar as Calendar
import Data.Time.Clock (UTCTime)
import qualified Data.Time.Clock as Clock
import qualified Data.Time.LocalTime as LocalTime
import qualified Data.Vector.Unboxed as Unboxed
import qualified Database.Persist as Psql
import qualified GHC.Conc.Sync as GHC
import Text.PrettyPrint.GenericPretty
import Universum
--
-- Trivial
--
deriving stock instance Generic Wire.Tag
instance Out Wire.Tag
deriving stock instance Generic Wire.WireValue
instance Out Wire.WireValue
deriving stock instance Generic Wire.TaggedValue
instance Out Wire.TaggedValue
deriving stock instance Generic Exception.BlockedIndefinitelyOnMVar
instance Out Exception.BlockedIndefinitelyOnMVar
deriving stock instance Generic Calendar.Day
instance Out Calendar.Day
deriving stock instance Generic LocalTime.TimeOfDay
instance Out LocalTime.TimeOfDay
deriving stock instance Generic UTCTime
instance Out UTCTime
deriving stock instance Generic (Fixed.Fixed a)
instance Out (Fixed.Fixed a)
deriving stock instance Generic Psql.PersistValue
instance Out Psql.PersistValue
deriving stock instance Generic Psql.LiteralType
instance Out Psql.LiteralType
instance
( Generic a,
Generic (Psql.Key a),
Out a,
Out (Psql.Key a)
) =>
Out (Psql.Entity a)
instance Out Secp256k1.PubKey
instance Out Secp256k1.Sig
instance (Out a) => Out (CI.CI a) where
docPrec x = docPrec x . CI.original
doc = doc . CI.original
--
-- Show
--
instance Out GHC.ThreadId where
docPrec = const Universum.show
doc = Universum.show
instance Out Clock.DiffTime where
docPrec = const Universum.show
doc = Universum.show
--
-- Composite
--
instance Out Word32 where
docPrec n = docPrec n . fromIntegral @Word32 @Integer
doc = doc . fromIntegral @Word32 @Integer
instance Out Word64 where
docPrec n = docPrec n . fromIntegral @Word64 @Integer
doc = doc . fromIntegral @Word64 @Integer
instance Out Int32 where
docPrec n = docPrec n . fromIntegral @Int32 @Integer
doc = doc . fromIntegral @Int32 @Integer
instance Out Int64 where
docPrec n = docPrec n . fromIntegral @Int64 @Integer
doc = doc . fromIntegral @Int64 @Integer
instance Out Text where
docPrec n = docPrec n . T.unpack
doc = doc . T.unpack
instance Out TL.Text where
docPrec n = docPrec n . TL.unpack
doc = doc . TL.unpack
instance Out ByteString where
docPrec n = docPrec n . newBsDoc
doc = doc . newBsDoc
instance (Out a) => Out (Vector a) where
docPrec n = docPrec n . toList
doc = doc . toList
instance
(Out a, Unboxed.Unbox a) =>
Out (Unboxed.Vector a)
where
docPrec n = docPrec n . Unboxed.toList
doc = doc . Unboxed.toList
instance (Out a, Out b) => Out (Map a b) where
docPrec n = docPrec n . toList
doc = doc . toList
--
-- Misc
--
data ByteStringDoc
= ByteStringUtf8 Text
| ByteStringHex Text
| ByteStringRaw Text
deriving stock (Generic)
instance Out ByteStringDoc
newBsDoc :: ByteString -> ByteStringDoc
newBsDoc bs =
case decodeUtf8' bs of
Right txt -> ByteStringUtf8 txt
Left {} ->
case decodeUtf8' $ B16.encode bs of
Right txt -> ByteStringHex txt
Left {} -> ByteStringRaw $ Universum.show bs