{-# LANGUAGE FlexibleInstances #-}

module Text.Chatty.Templates where

import Language.Haskell.TH

-- | Returns a TypeQ from a name
strToType :: Name -> Q Type
strToType s = do
  TyConI d <- reify s
  case d of
    DataD _ n _ _ _ -> conT $ simpleName n
    NewtypeD _ n _ _ _ -> conT $ simpleName n
    TySynD n _ _ -> conT $ simpleName n
  where
    simpleName :: Name -> Name
    simpleName nm =
      let s = nameBase nm
      in case dropWhile (/=':') s of
        []          -> mkName s
        _:[]        -> mkName s
        _:t         -> mkName t