{-# LANGUAGE GADTs #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} module Main (main) where import Data.Universe.Class (Universe (..)) import Data.Some (Some (..)) import Data.GADT.Show import Data.Universe.Some (UniverseSome (..)) import Data.Universe.Some.TH ------------------------------------------------------------------------------- -- Name ------------------------------------------------------------------------------- data Tag b a where IntTag :: Tag b Int BoolTag :: b -> Tag b Bool deriving instance Show b => Show (Tag b a) instance Show b => GShow (Tag b) where gshowsPrec = showsPrec deriveUniverseSome ''Tag ------------------------------------------------------------------------------- -- Dec ------------------------------------------------------------------------------- data Tag2 b a where IntTag2 :: Tag2 b Int BoolTag2 :: b -> Tag2 b Bool deriving instance Show b => Show (Tag2 b a) instance Show b => GShow (Tag2 b) where gshowsPrec = showsPrec deriveUniverseSome [d| instance Universe b => UniverseSome (Tag2 b) |] ------------------------------------------------------------------------------- -- Manual ------------------------------------------------------------------------------- data Tag3 b a where IntTag3 :: Tag3 b Int BoolTag3 :: b -> Tag3 b Bool deriving instance Show b => Show (Tag3 b a) instance Show b => GShow (Tag3 b) where gshowsPrec = showsPrec -- to separate splices $(return []) instance Universe b => UniverseSome (Tag3 b) where universeSome = $(universeSomeQ ''Tag3) ------------------------------------------------------------------------------- -- Main ------------------------------------------------------------------------------- main :: IO () main = do print (universe :: [Some (Tag (Maybe Bool)) ]) print (universe :: [Some (Tag2 (Maybe Bool)) ]) print (universe :: [Some (Tag3 (Maybe Bool)) ])