content: {-# LANGUAGE DataKinds #-}
  module Main where
  
  import Criterion.Main
  import SOPBench.Type
  import SOPBench.Roundtrip
  
  main :: IO ()
  main =
    defaultMainWith defaultConfig
      [ bgroup "Roundtrip"
        [ bgroup "S2"
          [ bench "GHCGeneric"     $ nf roundtrip (s2 :: S2 'GHCGeneric)
          , bench "SOPGGP"         $ nf roundtrip (s2 :: S2 'SOPGGP    )
          , bench "SOPTH"          $ nf roundtrip (s2 :: S2 'SOPTH     )
          ]
        , bgroup "S20"
          [ bench "GHCGeneric"    $ nf roundtrip (s20 :: S20 'GHCGeneric)
          , bench "SOPGGP"        $ nf roundtrip (s20 :: S20 'SOPGGP    )
          , bench "SOPTH"         $ nf roundtrip (s20 :: S20 'SOPTH     )
          ]
        , bgroup "PB2"
          [ bench "GHCGeneric"    $ nf roundtrip (pb2 :: PB2 'GHCGeneric)
          , bench "SOPGGP"        $ nf roundtrip (pb2 :: PB2 'SOPGGP    )
          , bench "SOPTH"         $ nf roundtrip (pb2 :: PB2 'SOPTH     )
          ]
        ]
      , bgroup "Eq"
        [ bgroup "S2"
          [ bench "GHCDeriving"           $ nf ((==) s2) (s2 :: S2 'GHCDeriving)
          , bench "SOPGGP"                $ nf ((==) s2) (s2 :: S2 'SOPGGP     )
          , bench "SOPTH"                 $ nf ((==) s2) (s2 :: S2 'SOPTH      )
          ]
        , bgroup "S20"
          [ bench "GHCDeriving"          $ nf ((==) s20) (s20 :: S20 'GHCDeriving)
          , bench "SOPGGP"               $ nf ((==) s20) (s20 :: S20 'SOPGGP     )
          , bench "SOPTH"                $ nf ((==) s20) (s20 :: S20 'SOPTH      )
          ]
        , bgroup "PB2"
          [ bench "GHCDeriving"          $ nf ((==) pb2) (pb2 :: PB2 'GHCDeriving)
          , bench "SOPGGP"               $ nf ((==) pb2) (pb2 :: PB2 'SOPGGP     )
          , bench "SOPTH"                $ nf ((==) pb2) (pb2 :: PB2 'SOPTH      )
          ]
        , bgroup "Tree"
          [ bench "GHCDeriving"         $ nf ((==) tree) (tree :: Tree 'GHCDeriving)
          , bench "SOPGGP"              $ nf ((==) tree) (tree :: Tree 'SOPGGP     )
          , bench "SOPTH"               $ nf ((==) tree) (tree :: Tree 'SOPTH      )
          ]
        , bgroup "Tree large"
          [ bench "GHCDeriving"   $ nf ((==) tree_large) (tree_large :: Tree 'GHCDeriving)
          , bench "SOPGGP"        $ nf ((==) tree_large) (tree_large :: Tree 'SOPGGP     )
          , bench "SOPTH"         $ nf ((==) tree_large) (tree_large :: Tree 'SOPTH      )
          ]
        ]
      , bgroup "Show"
        [ bgroup "S2"
          [ bench "GHCDeriving"         $ nf show (s2 :: S2 'GHCDeriving)
          , bench "SOPGGP"              $ nf show (s2 :: S2 'SOPGGP     )
          , bench "SOPTH"               $ nf show (s2 :: S2 'SOPTH      )
          ]
        , bgroup "S20"
          [ bench "GHCDeriving"        $ nf show (s20 :: S20 'GHCDeriving)
          , bench "SOPGGP"             $ nf show (s20 :: S20 'SOPGGP     )
          , bench "SOPTH"              $ nf show (s20 :: S20 'SOPTH      )
          ]
        , bgroup "PB2"
          [ bench "GHCDeriving"        $ nf show (pb2 :: PB2 'GHCDeriving)
          , bench "SOPGGP"             $ nf show (pb2 :: PB2 'SOPGGP     )
          , bench "SOPTH"              $ nf show (pb2 :: PB2 'SOPTH      )
          ]
        , bgroup "Tree"
          [ bench "GHCDeriving"       $ nf show (tree :: Tree 'GHCDeriving)
          , bench "SOPGGP"            $ nf show (tree :: Tree 'SOPGGP     )
          , bench "SOPTH"             $ nf show (tree :: Tree 'SOPTH      )
          ]
        , bgroup "Tree large"
          [ bench "GHCDeriving" $ nf show (tree_large :: Tree 'GHCDeriving)
          , bench "SOPGGP"      $ nf show (tree_large :: Tree 'SOPGGP     )
          , bench "SOPTH"       $ nf show (tree_large :: Tree 'SOPTH      )
          ]
        ]
      ]
  