{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
module Prettyprinter.Generics
( ppGeneric
, PPGenericOverride(..)
, Pretty(..)
, Generic
) where
import Data.Bimap (Bimap)
import Data.ByteString.Char8 qualified as C8
import Data.ByteString.Lazy.Char8 qualified as CL8
import Data.ByteString.Short qualified as ShortBS
import Data.DList (DList)
import Data.DList qualified as DList
import Data.Foldable
import Data.Functor.Compose
import Data.HashMap.Strict (HashMap)
import Data.HashSet (HashSet)
import Data.Int
import Data.IntMap (IntMap)
import Data.IntSet qualified as IntSet
import Data.Kind
import Data.List.NonEmpty (NonEmpty)
import Data.Map (Map)
import Data.Proxy
import Data.Semigroup qualified as Semigroup
import Data.Set (Set)
import Data.Text (Text)
import Data.Text qualified as T
import Data.Text.Lazy qualified as TL
import Data.Vector (Vector)
import Data.Void
import Data.Word
import GHC.ForeignPtr (ForeignPtr(..))
import GHC.Generics
import GHC.Real (Ratio(..))
import GHC.Stack (CallStack)
import GHC.TypeLits
#if !MIN_VERSION_GLASGOW_HASKELL(9, 2, 0, 0)
import Numeric.Natural
#endif
import Prettyprinter
import Prettyprinter.Combinators
import Prettyprinter.MetaDoc
import Language.Haskell.TH qualified as TH
import Language.Haskell.TH.Syntax qualified as TH
ppGeneric :: (Generic a, GPretty (Rep a)) => a -> Doc ann
ppGeneric :: forall a ann. (Generic a, GPretty (Rep a)) => a -> Doc ann
ppGeneric = forall ann. MetaDoc ann -> Doc ann
mdPayload forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
class GPretty (a :: Type -> Type) where
gpretty :: a ix -> MetaDoc ann
instance GPretty V1 where
gpretty :: forall ix ann. V1 ix -> MetaDoc ann
gpretty V1 ix
_ = forall a. HasCallStack => [Char] -> a
error [Char]
"gpretty for V1"
instance GPretty U1 where
gpretty :: forall ix ann. U1 ix -> MetaDoc ann
gpretty U1 ix
U1 = forall a. Monoid a => a
mempty
instance (GPretty f, GPretty g) => GPretty (f :+: g) where
gpretty :: forall ix ann. (:+:) f g ix -> MetaDoc ann
gpretty = \case
L1 f ix
x -> forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty f ix
x
R1 g ix
y -> forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty g ix
y
instance PPGenericOverride a => GPretty (K1 i a) where
gpretty :: forall ix ann. K1 i a ix -> MetaDoc ann
gpretty = forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i c (p :: k). K1 i c p -> c
unK1
class PPGenericOverride a where
ppGenericOverride :: a -> MetaDoc ann
ppGenericOverrideDoc :: PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc :: forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc = forall ann. MetaDoc ann -> Doc ann
mdPayload forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride
newtype PPGenericOverrideToPretty a = PPGenericOverrideToPretty { forall a. PPGenericOverrideToPretty a -> a
unPPGenericOverrideToPretty :: a }
instance PPGenericOverride a => Pretty (PPGenericOverrideToPretty a) where
pretty :: forall ann. PPGenericOverrideToPretty a -> Doc ann
pretty = forall ann. MetaDoc ann -> Doc ann
mdPayload forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. PPGenericOverrideToPretty a -> a
unPPGenericOverrideToPretty
instance Pretty a => PPGenericOverride a where
ppGenericOverride :: forall ann. a -> MetaDoc ann
ppGenericOverride = forall ann. Doc ann -> MetaDoc ann
compositeMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty
instance {-# OVERLAPS #-} PPGenericOverride Int where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Int -> MetaDoc ann
ppGenericOverride = forall ann. Int -> MetaDoc ann
metaDocInt
instance {-# OVERLAPS #-} PPGenericOverride Float where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Float -> MetaDoc ann
ppGenericOverride = forall ann. Float -> MetaDoc ann
metaDocFloat
instance {-# OVERLAPS #-} PPGenericOverride Double where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Double -> MetaDoc ann
ppGenericOverride = forall ann. Double -> MetaDoc ann
metaDocDouble
instance {-# OVERLAPS #-} PPGenericOverride Integer where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Integer -> MetaDoc ann
ppGenericOverride = forall ann. Integer -> MetaDoc ann
metaDocInteger
instance {-# OVERLAPS #-} PPGenericOverride Natural where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Natural -> MetaDoc ann
ppGenericOverride = forall ann. Natural -> MetaDoc ann
metaDocNatural
instance {-# OVERLAPS #-} PPGenericOverride Word where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Word -> MetaDoc ann
ppGenericOverride = forall ann. Word -> MetaDoc ann
metaDocWord
instance {-# OVERLAPS #-} PPGenericOverride Word8 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Word8 -> MetaDoc ann
ppGenericOverride = forall ann. Word8 -> MetaDoc ann
metaDocWord8
instance {-# OVERLAPS #-} PPGenericOverride Word16 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Word16 -> MetaDoc ann
ppGenericOverride = forall ann. Word16 -> MetaDoc ann
metaDocWord16
instance {-# OVERLAPS #-} PPGenericOverride Word32 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Word32 -> MetaDoc ann
ppGenericOverride = forall ann. Word32 -> MetaDoc ann
metaDocWord32
instance {-# OVERLAPS #-} PPGenericOverride Word64 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Word64 -> MetaDoc ann
ppGenericOverride = forall ann. Word64 -> MetaDoc ann
metaDocWord64
instance {-# OVERLAPS #-} PPGenericOverride Int8 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Int8 -> MetaDoc ann
ppGenericOverride = forall ann. Int8 -> MetaDoc ann
metaDocInt8
instance {-# OVERLAPS #-} PPGenericOverride Int16 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Int16 -> MetaDoc ann
ppGenericOverride = forall ann. Int16 -> MetaDoc ann
metaDocInt16
instance {-# OVERLAPS #-} PPGenericOverride Int32 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Int32 -> MetaDoc ann
ppGenericOverride = forall ann. Int32 -> MetaDoc ann
metaDocInt32
instance {-# OVERLAPS #-} PPGenericOverride Int64 where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Int64 -> MetaDoc ann
ppGenericOverride = forall ann. Int64 -> MetaDoc ann
metaDocInt64
instance {-# OVERLAPS #-} PPGenericOverride () where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. () -> MetaDoc ann
ppGenericOverride = forall ann. () -> MetaDoc ann
metaDocUnit
instance {-# OVERLAPS #-} PPGenericOverride Bool where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Bool -> MetaDoc ann
ppGenericOverride = forall ann. Bool -> MetaDoc ann
metaDocBool
instance {-# OVERLAPS #-} PPGenericOverride Char where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Char -> MetaDoc ann
ppGenericOverride = forall ann. Char -> MetaDoc ann
metaDocChar
instance {-# OVERLAPS #-} PPGenericOverride a => PPGenericOverride (Ratio a) where
{-# INLINABLE ppGenericOverride #-}
ppGenericOverride :: forall ann. Ratio a -> MetaDoc ann
ppGenericOverride (a
x :% a
y) =
forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride a
x forall a. Semigroup a => a -> a -> a
Semigroup.<> forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc Doc ann
"/" forall a. Semigroup a => a -> a -> a
<> forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride a
y
instance {-# OVERLAPS #-} PPGenericOverride CallStack where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. CallStack -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
compositeMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. CallStack -> Doc ann
ppCallStack
instance {-# OVERLAPS #-} PPGenericOverride (Doc Void) where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Doc Void -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
compositeMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Void -> a
absurd
instance {-# OVERLAPS #-} PPGenericOverride String where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. [Char] -> MetaDoc ann
ppGenericOverride = forall ann. [Char] -> MetaDoc ann
stringMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride T.Text where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Text -> MetaDoc ann
ppGenericOverride = forall ann. Text -> MetaDoc ann
strictTextMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride TL.Text where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. Text -> MetaDoc ann
ppGenericOverride = forall ann. Text -> MetaDoc ann
lazyTextMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride C8.ByteString where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. ByteString -> MetaDoc ann
ppGenericOverride = forall ann. ByteString -> MetaDoc ann
strictByteStringMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride CL8.ByteString where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. ByteString -> MetaDoc ann
ppGenericOverride = forall ann. ByteString -> MetaDoc ann
lazyByteStringMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride ShortBS.ShortByteString where
{-# INLINE ppGenericOverride #-}
ppGenericOverride :: forall ann. ShortByteString -> MetaDoc ann
ppGenericOverride = forall ann. ShortByteString -> MetaDoc ann
shortByteStringMetaDoc
instance {-# OVERLAPS #-} PPGenericOverride (ForeignPtr a) where ppGenericOverride :: forall ann. ForeignPtr a -> MetaDoc ann
ppGenericOverride = forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. Pretty a => a -> Doc ann
pretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Show a => a -> [Char]
show
instance {-# OVERLAPS #-} PPGenericOverride TH.OccName where ppGenericOverride :: forall ann. OccName -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.NameFlavour where ppGenericOverride :: forall ann. NameFlavour -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.PkgName where ppGenericOverride :: forall ann. PkgName -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.NameSpace where ppGenericOverride :: forall ann. NameSpace -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.ModName where ppGenericOverride :: forall ann. ModName -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Name where ppGenericOverride :: forall ann. Name -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#if MIN_VERSION_template_haskell(2, 17, 0)
instance {-# OVERLAPS #-} PPGenericOverride a => PPGenericOverride (TH.TyVarBndr a) where ppGenericOverride :: forall ann. TyVarBndr a -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#else
instance {-# OVERLAPS #-} PPGenericOverride TH.TyVarBndr where ppGenericOverride = gpretty . from
#endif
instance {-# OVERLAPS #-} PPGenericOverride TH.TyLit where ppGenericOverride :: forall ann. TyLit -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Type where ppGenericOverride :: forall ann. Kind -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.SourceUnpackedness where ppGenericOverride :: forall ann. SourceUnpackedness -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.SourceStrictness where ppGenericOverride :: forall ann. SourceStrictness -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Bang where ppGenericOverride :: forall ann. Bang -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Con where ppGenericOverride :: forall ann. Con -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Lit where ppGenericOverride :: forall ann. Lit -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Bytes where ppGenericOverride :: forall ann. Bytes -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Stmt where ppGenericOverride :: forall ann. Stmt -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Guard where ppGenericOverride :: forall ann. Guard -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Body where ppGenericOverride :: forall ann. Body -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Match where ppGenericOverride :: forall ann. Match -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Range where ppGenericOverride :: forall ann. Range -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Exp where ppGenericOverride :: forall ann. Exp -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Pat where ppGenericOverride :: forall ann. Pat -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Clause where ppGenericOverride :: forall ann. Clause -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#if MIN_VERSION_template_haskell(2, 12, 0)
instance {-# OVERLAPS #-} PPGenericOverride TH.DerivStrategy where ppGenericOverride :: forall ann. DerivStrategy -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.DerivClause where ppGenericOverride :: forall ann. DerivClause -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#endif
instance {-# OVERLAPS #-} PPGenericOverride TH.FunDep where ppGenericOverride :: forall ann. FunDep -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Overlap where ppGenericOverride :: forall ann. Overlap -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Callconv where ppGenericOverride :: forall ann. Callconv -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Safety where ppGenericOverride :: forall ann. Safety -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Foreign where ppGenericOverride :: forall ann. Foreign -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.FixityDirection where ppGenericOverride :: forall ann. FixityDirection -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Fixity where ppGenericOverride :: forall ann. Fixity -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Inline where ppGenericOverride :: forall ann. Inline -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.RuleMatch where ppGenericOverride :: forall ann. RuleMatch -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Phases where ppGenericOverride :: forall ann. Phases -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.RuleBndr where ppGenericOverride :: forall ann. RuleBndr -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.AnnTarget where ppGenericOverride :: forall ann. AnnTarget -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Pragma where ppGenericOverride :: forall ann. Pragma -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.TySynEqn where ppGenericOverride :: forall ann. TySynEqn -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.FamilyResultSig where ppGenericOverride :: forall ann. FamilyResultSig -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.InjectivityAnn where ppGenericOverride :: forall ann. InjectivityAnn -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.TypeFamilyHead where ppGenericOverride :: forall ann. TypeFamilyHead -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Role where ppGenericOverride :: forall ann. Role -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#if MIN_VERSION_template_haskell(2, 12, 0)
instance {-# OVERLAPS #-} PPGenericOverride TH.PatSynArgs where ppGenericOverride :: forall ann. PatSynArgs -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.PatSynDir where ppGenericOverride :: forall ann. PatSynDir -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#endif
instance {-# OVERLAPS #-} PPGenericOverride TH.Dec where ppGenericOverride :: forall ann. Dec -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
instance {-# OVERLAPS #-} PPGenericOverride TH.Info where ppGenericOverride :: forall ann. Info -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#if MIN_VERSION_template_haskell(2, 17, 0)
instance {-# OVERLAPS #-} PPGenericOverride TH.Specificity where ppGenericOverride :: forall ann. Specificity -> MetaDoc ann
ppGenericOverride = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from
#endif
instance {-# OVERLAPS #-}
( PPGenericOverride a
, PPGenericOverride b
) => PPGenericOverride (a, b) where
ppGenericOverride :: forall ann. (a, b) -> MetaDoc ann
ppGenericOverride (a
a, b
b) = forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall a b. (a -> b) -> a -> b
$ forall a ann. Pretty a => a -> Doc ann
pretty
( forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty a
a
, forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty b
b
)
instance {-# OVERLAPS #-}
( PPGenericOverride a
, PPGenericOverride b
, PPGenericOverride c
) => PPGenericOverride (a, b, c) where
ppGenericOverride :: forall ann. (a, b, c) -> MetaDoc ann
ppGenericOverride (a
a, b
b, c
c) = forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall a b. (a -> b) -> a -> b
$ forall a ann. Pretty a => a -> Doc ann
pretty
( forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty a
a
, forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty b
b
, forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty c
c
)
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (Maybe v) where
ppGenericOverride :: forall ann. Maybe v -> MetaDoc ann
ppGenericOverride =
forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a x. Generic a => a -> Rep a x
from forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. a -> PPGenericOverrideToPretty a
PPGenericOverrideToPretty
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride [v] where
ppGenericOverride :: forall ann. [v] -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. (a -> Doc ann) -> [a] -> Doc ann
ppListWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} (PPGenericOverride k, PPGenericOverride v) => PPGenericOverride [(k, v)] where
ppGenericOverride :: forall ann. [(k, v)] -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k ann v.
(k -> Doc ann) -> (v -> Doc ann) -> [(k, v)] -> Doc ann
ppAssocListWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride k => PPGenericOverride (NonEmpty k) where
ppGenericOverride :: forall ann. NonEmpty k -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. (a -> Doc ann) -> NonEmpty a -> Doc ann
ppNEWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (Vector v) where
ppGenericOverride :: forall ann. Vector v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (v :: * -> *) a ann.
Vector v a =>
(a -> Doc ann) -> v a -> Doc ann
ppVectorWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} (PPGenericOverride k, PPGenericOverride v) => PPGenericOverride (Map k v) where
ppGenericOverride :: forall ann. Map k v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k ann v.
(k -> Doc ann) -> (v -> Doc ann) -> Map k v -> Doc ann
ppMapWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (Set v) where
ppGenericOverride :: forall ann. Set v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. (a -> Doc ann) -> Set a -> Doc ann
ppSetWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} (PPGenericOverride k, PPGenericOverride v) => PPGenericOverride (Bimap k v) where
ppGenericOverride :: forall ann. Bimap k v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k ann v.
(k -> Doc ann) -> (v -> Doc ann) -> Bimap k v -> Doc ann
ppBimapWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride IntSet.IntSet where
ppGenericOverride :: forall ann. IntSet -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann. (Int -> Doc ann) -> IntSet -> Doc ann
ppIntSetWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (IntMap v) where
ppGenericOverride :: forall ann. IntMap v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall ann a.
(Int -> Doc ann) -> (a -> Doc ann) -> IntMap a -> Doc ann
ppIntMapWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride v => PPGenericOverride (HashSet v) where
ppGenericOverride :: forall ann. HashSet v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a ann. (a -> Doc ann) -> HashSet a -> Doc ann
ppHashSetWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} (PPGenericOverride k, PPGenericOverride v) => PPGenericOverride (HashMap k v) where
ppGenericOverride :: forall ann. HashMap k v -> MetaDoc ann
ppGenericOverride =
forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k ann v.
(k -> Doc ann) -> (v -> Doc ann) -> HashMap k v -> Doc ann
ppHashMapWith forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc forall a ann. PPGenericOverride a => a -> Doc ann
ppGenericOverrideDoc
instance {-# OVERLAPS #-} PPGenericOverride (f (g a)) => PPGenericOverride (Compose f g a) where
ppGenericOverride :: forall ann. Compose f g a -> MetaDoc ann
ppGenericOverride =
forall a ann. PPGenericOverride a => a -> MetaDoc ann
ppGenericOverride forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall {k1} {k2} (f :: k1 -> *) (g :: k2 -> k1) (a :: k2).
Compose f g a -> f (g a)
getCompose
instance (GPretty f, GPretty g) => GPretty (f :*: g) where
gpretty :: forall ix ann. (:*:) f g ix -> MetaDoc ann
gpretty (f ix
x :*: g ix
y) =
forall ann. Doc ann -> MetaDoc ann
compositeMetaDoc forall a b. (a -> b) -> a -> b
$ forall ann. MetaDoc ann -> Doc ann
mdPayload MetaDoc ann
x' forall ann. Doc ann -> Doc ann -> Doc ann
<+> forall ann. MetaDoc ann -> Doc ann
mdPayload MetaDoc ann
y'
where
x' :: MetaDoc ann
x' = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty f ix
x
y' :: MetaDoc ann
y' = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty g ix
y
instance GPretty x => GPretty (M1 D ('MetaData a b c d) x) where
gpretty :: forall ix ann. M1 D ('MetaData a b c d) x ix -> MetaDoc ann
gpretty = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance GPretty x => GPretty (M1 S ('MetaSel 'Nothing b c d) x) where
gpretty :: forall ix ann. M1 S ('MetaSel 'Nothing b c d) x ix -> MetaDoc ann
gpretty = forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance (KnownSymbol name, GFields x) => GPretty (M1 C ('MetaCons name _fixity 'False) x) where
gpretty :: forall ix ann.
M1 C ('MetaCons name _fixity 'False) x ix -> MetaDoc ann
gpretty (M1 x ix
x) =
forall ann. MetaDoc ann -> [MetaDoc ann] -> MetaDoc ann
constructorAppMetaDoc forall ann. MetaDoc ann
constructor forall ann. [MetaDoc ann]
args
where
constructor :: MetaDoc ann
constructor :: forall ann. MetaDoc ann
constructor = forall ann. Doc ann -> MetaDoc ann
atomicMetaDoc forall a b. (a -> b) -> a -> b
$ forall a ann. Pretty a => a -> Doc ann
pretty forall a b. (a -> b) -> a -> b
$ forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> [Char]
symbolVal forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @name
args :: [MetaDoc ann]
args :: forall ann. [MetaDoc ann]
args = forall (t :: * -> *) a. Foldable t => t a -> [a]
toList forall a b. (a -> b) -> a -> b
$ forall (a :: * -> *) ix ann.
GFields a =>
a ix -> DList (MetaDoc ann)
gfields x ix
x
class GFields a where
gfields :: a ix -> DList (MetaDoc ann)
instance GFields U1 where
{-# INLINE gfields #-}
gfields :: forall ix ann. U1 ix -> DList (MetaDoc ann)
gfields = forall a b. a -> b -> a
const forall a. Monoid a => a
mempty
instance GPretty x => GFields (M1 S ('MetaSel a b c d) x) where
{-# INLINABLE gfields #-}
gfields :: forall ix ann. M1 S ('MetaSel a b c d) x ix -> DList (MetaDoc ann)
gfields = forall a. a -> DList a
DList.singleton forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k i (c :: Meta) (f :: k -> *) (p :: k). M1 i c f p -> f p
unM1
instance (GFields f, GFields g) => GFields (f :*: g) where
{-# INLINABLE gfields #-}
gfields :: forall ix ann. (:*:) f g ix -> DList (MetaDoc ann)
gfields (f ix
f :*: g ix
g) = forall (a :: * -> *) ix ann.
GFields a =>
a ix -> DList (MetaDoc ann)
gfields f ix
f forall a. Semigroup a => a -> a -> a
<> forall (a :: * -> *) ix ann.
GFields a =>
a ix -> DList (MetaDoc ann)
gfields g ix
g
instance (KnownSymbol name, GCollectRecord f) => GPretty (M1 C ('MetaCons name _fixity 'True) f) where
gpretty :: forall ix ann.
M1 C ('MetaCons name _fixity 'True) f ix -> MetaDoc ann
gpretty (M1 f ix
x) =
forall ann. Doc ann -> MetaDoc ann
compositeMetaDoc forall a b. (a -> b) -> a -> b
$
forall ann. Doc ann -> [MapEntry Text (Doc ann)] -> Doc ann
ppDictHeader
(forall a ann. Pretty a => a -> Doc ann
pretty (forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> [Char]
symbolVal (forall {k} (t :: k). Proxy t
Proxy @name)))
(forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall ann. MetaDoc ann -> Doc ann
mdPayload) (forall (t :: * -> *) a. Foldable t => t a -> [a]
toList (forall (a :: * -> *) ix ann.
GCollectRecord a =>
a ix -> DList (MapEntry Text (MetaDoc ann))
gcollectRecord f ix
x)))
class GCollectRecord a where
gcollectRecord :: a ix -> DList (MapEntry Text (MetaDoc ann))
instance (KnownSymbol name, GPretty a) => GCollectRecord (M1 S ('MetaSel ('Just name) su ss ds) a) where
{-# INLINABLE gcollectRecord #-}
gcollectRecord :: forall ix ann.
M1 S ('MetaSel ('Just name) su ss ds) a ix
-> DList (MapEntry Text (MetaDoc ann))
gcollectRecord (M1 a ix
x) =
forall a. a -> DList a
DList.singleton ([Char] -> Text
T.pack (forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> [Char]
symbolVal (forall {k} (t :: k). Proxy t
Proxy @name)) forall k v. k -> v -> MapEntry k v
:-> forall (a :: * -> *) ix ann. GPretty a => a ix -> MetaDoc ann
gpretty a ix
x)
instance (GCollectRecord f, GCollectRecord g) => GCollectRecord (f :*: g) where
{-# INLINABLE gcollectRecord #-}
gcollectRecord :: forall ix ann. (:*:) f g ix -> DList (MapEntry Text (MetaDoc ann))
gcollectRecord (f ix
f :*: g ix
g) = forall (a :: * -> *) ix ann.
GCollectRecord a =>
a ix -> DList (MapEntry Text (MetaDoc ann))
gcollectRecord f ix
f forall a. Semigroup a => a -> a -> a
<> forall (a :: * -> *) ix ann.
GCollectRecord a =>
a ix -> DList (MapEntry Text (MetaDoc ann))
gcollectRecord g ix
g
instance GCollectRecord U1 where
{-# INLINABLE gcollectRecord #-}
gcollectRecord :: forall ix ann. U1 ix -> DList (MapEntry Text (MetaDoc ann))
gcollectRecord = forall a b. a -> b -> a
const forall a. Monoid a => a
mempty