mkGetoptTHTypeSig :: Type -> Q Type
mkGetoptTHTypeSig t = do
  a <- newName "a"
  return .
    ForallT [PlainTV a] [ClassP ''NFData [VarT a], ClassP ''Show [VarT a]] $
    tsArrows [ -- ConT ''ArgArity
             -- , ConT ''String
             -- ,
             tsArrows [ ConT ''String , appTIO(VarT a) ]
             ,
               appTIO (tupleL [ listOfN a, t ])
             ]

-- Typeish ---------------------------------------------------------------------

-- | a type, given a String name, represented as a Name or a Type as necessary
mkGetoptTHTypeSig :: Type -> Q Type
mkGetoptTHTypeSig t = do
  a <- newName "a"
  return .
    ForallT [PlainTV a] [ClassP ''NFData [VarT a], ClassP ''Show [VarT a]] $
    tsArrows [ -- ConT ''ArgArity
             -- , ConT ''String
             -- ,
             tsArrows [ ConT ''String , appTIO(VarT a) ]
             ,
               appTIO (tupleL [ listOfN a, t ])
             ]

-- Typeish ---------------------------------------------------------------------

-- | a type, given a String name, represented as a Name or a Type as necessary
mkGetoptTHTypeSig t = do
  a <- newName "a"
  return .
    ForallT [PlainTV a] [ClassP ''NFData [VarT a], ClassP ''Show [VarT a]] $
    tsArrows [ -- ConT ''ArgArity
             -- , ConT ''String
             -- ,
             tsArrows [ ConT ''String , appTIO(VarT a) ]
             ,
               appTIO (tupleL [ listOfN a, t ])
             ]

-- Typeish ---------------------------------------------------------------------

-- | a type, given a String name, represented as a Name or a Type as necessary