{-# LANGUAGE
DeriveAnyClass,
DeriveGeneric,
DerivingVia,
DerivingStrategies,
FlexibleInstances,
ScopedTypeVariables,
StandaloneDeriving,
TypeApplications
#-}
import Data.Semigroup (Sum(..))
import Text.Show (showParen, showString)
import Control.DeepSeq
import Criterion.Main
import Generic.Data
import Generic.Data.Microsurgery
data H -- handwritten
data G -- generic
data S -- surgery
data T x = C { _a :: Sum Int, _b :: [Int] }
deriving stock Generic
deriving via (Surgery Derecordify (T S)) instance Show (T S)
instance Show (T H) where
showsPrec n (C a b) =
showParen (n > 10)
(showString "C "
. showsPrec 11 a
. showString " "
. showsPrec 11 b)
deriving via (Generically (T G)) instance Semigroup (T G)
instance Semigroup (T H) where
C a1 b1 <> C a2 b2 = C (a1 <> a2) (b1 <> b2)
deriving anyclass instance NFData (T G)
instance NFData (T H) where
rnf (C a b) = rnf a `seq` rnf b `seq` ()
u :: forall x. T x
u = C 33 [99]
v :: forall x. T x
v = C 13 [14]
main :: IO ()
main = defaultMain
[ bgroup "Show"
[ bench "handwri" (nf show (u @H))
, bench "surgery" (nf show (u @S))
]
, bgroup "NFData"
[ bench "handwri" (nf id (u @H))
, bench "generic" (nf id (u @G))
]
, bgroup "Semigroup"
[ bench "baselin" (nf (uncurry (++)) ([99], [14 :: Int]))
, bench "handwri" (nf (uncurry (<>)) (u @H, v))
, bench "generic" (nf (uncurry (<>)) (u @G, v))
]
]