content: {-# LANGUAGE FlexibleContexts       #-}
  {-# LANGUAGE FlexibleInstances      #-}
  {-# LANGUAGE DeriveGeneric          #-}
  {-# LANGUAGE DeriveFunctor          #-}
  {-# LANGUAGE DefaultSignatures      #-}
  {-# LANGUAGE StandaloneDeriving     #-}
  {-# LANGUAGE UndecidableInstances   #-}
  {-# LANGUAGE DeriveAnyClass    #-}
  
  module Main where
  
  import GHC.Generics hiding (C, C1, D)
  import GEq1A
  import Enum
  import GFunctor
  
  data A = A1
    deriving (Show, Generic, GEq, GEnum)
  
  data B a = B1 | B2 a (B a)
    deriving (Show, Generic, Generic1, GEq, GEnum, GFunctor)
  
  data C phantom a = C1 | C2 a (C phantom a)
    deriving (Show, Generic, Generic1, GEq, GEnum, GFunctor)
  
  data D f a = D1 (f a) (f (D f a)) deriving (Generic, Generic1)
  deriving instance (Show (f a), Show (f (D f a))) => Show (D f a)
  deriving instance (GEq  (f a), GEq  (f (D f a))) => GEq  (D f a)
  
  data E f a = E1 (f a)
    deriving (Show, Eq, Generic, Generic1, GFunctor)
  
  
  main = print (
                 geq A1 A1
               , take 10 (genum :: [A])
  
               , geq (B2 A1 B1) B1
               , gmap (++ "lo") (B2 "hel" B1)
               , take 3 (genum :: [B A])
  
               , geq (C2 A1 C1) C1
               , gmap (++ "lo") (C2 "hel" C1)
  
               , geq (D1 "a" []) (D1 "a" [])
  
               , gmap (++ "lo") (E1 ["hel"])
               )
  