text-show-2: tests/Derived/DatatypeContexts.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE DatatypeContexts #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -w #-}
{-|
Module: Derived.DatatypeContexts
Copyright: (C) 2014-2015 Ryan Scott
License: BSD-style (see the file LICENSE)
Maintainer: Ryan Scott
Stability: Provisional
Portability: GHC
Defines data types with DatatypeContexts (which are gross, but still possible).
-}
module Derived.DatatypeContexts (TyCon(..), TyFamily(..)) where
import GHC.Show (appPrec, appPrec1, showSpace)
import Prelude ()
import Prelude.Compat
import Test.QuickCheck (Arbitrary(..))
import TextShow (TextShow(..), TextShow1(..), TextShow2(..))
import TextShow.TH (makeShowbPrec, makeShowbPrecWith, makeShowbPrecWith2)
import TransformersCompat (Show1(..), Show2(..))
-------------------------------------------------------------------------------
data Ord a => TyCon a b c = TyCon a b c
deriving Show
-------------------------------------------------------------------------------
data family TyFamily
#if __GLASGOW_HASKELL__ >= 708 && __GLASGOW_HASKELL__ < 710
a b c :: *
#else
x y z :: *
#endif
data instance Ord a => TyFamily a b c = TyFamily a b c
deriving Show
-------------------------------------------------------------------------------
instance (Ord a, Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (TyCon a b c) where
arbitrary = TyCon <$> arbitrary <*> arbitrary <*> arbitrary
instance (Ord a, Arbitrary a, Arbitrary b, Arbitrary c) => Arbitrary (TyFamily a b c) where
arbitrary = TyFamily <$> arbitrary <*> arbitrary <*> arbitrary
-------------------------------------------------------------------------------
instance (Ord a, Show a, Show b) => Show1 (TyCon a b) where
showsPrecWith = showsPrecWith2 showsPrec
instance (Ord a, Show a) => Show2 (TyCon a) where
showsPrecWith2 sp1 sp2 p (TyCon a b c) =
showsThree sp1 sp2 "TyCon" p a b c
instance (Ord a, Show a, Show b) => Show1 (TyFamily a b) where
showsPrecWith = showsPrecWith2 showsPrec
instance (Ord a, Show a) => Show2 (TyFamily a) where
showsPrecWith2 sp1 sp2 p (TyFamily a b c) =
showsThree sp1 sp2 "TyFamily" p a b c
showsThree :: Show a
=> (Int -> b -> ShowS) -> (Int -> c -> ShowS)
-> String -> Int -> a -> b -> c -> ShowS
showsThree sp1 sp2 name p a b c = showParen (p > appPrec) $
showString name . showSpace
. showsPrec appPrec1 a . showSpace
. sp1 appPrec1 b . showSpace
. sp2 appPrec1 c
-------------------------------------------------------------------------------
$(return [])
instance (Ord a, TextShow a, TextShow b, TextShow c) => TextShow (TyCon a b c) where
showbPrec = $(makeShowbPrec ''TyCon)
instance (Ord a, TextShow a, TextShow b) => TextShow1 (TyCon a b) where
showbPrecWith = $(makeShowbPrecWith ''TyCon)
instance (Ord a, TextShow a) => TextShow2 (TyCon a) where
showbPrecWith2 = $(makeShowbPrecWith2 ''TyCon)
#if MIN_VERSION_template_haskell(2,7,0)
instance (Ord a, TextShow a, TextShow b, TextShow c) => TextShow (TyFamily a b c) where
showbPrec = $(makeShowbPrec 'TyFamily)
instance (Ord a, TextShow a, TextShow b) => TextShow1 (TyFamily a b) where
showbPrecWith = $(makeShowbPrecWith 'TyFamily)
instance (Ord a, TextShow a) => TextShow2 (TyFamily a) where
showbPrecWith2 = $(makeShowbPrecWith2 'TyFamily)
#endif