{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE ScopedTypeVariables #-} module Haddock.Backends.Xhtml.Specialize ( specialize, specialize' , specializeTyVarBndrs , sugar ) where import Haddock.Syb import GHC import Name import Data.Data specialize :: (Eq name, Typeable name) => Data a => name -> HsType name -> a -> a specialize name details = everywhere (mkT $ specializeStep name details) specialize' :: (Eq name, Typeable name) => Data a => [(name, HsType name)] -> a -> a specialize' = flip $ foldr (uncurry specialize) specializeStep :: Eq name => name -> HsType name -> HsType name -> HsType name specializeStep name details (HsTyVar name') | name == name' = details specializeStep _ _ typ = typ specializeTyVarBndrs :: (Eq name, Typeable name, DataId name) => LHsTyVarBndrs name -> [HsType name] -> HsType name -> HsType name specializeTyVarBndrs bndrs typs = specialize' $ zip bndrs' typs where bndrs' = map (bname . unLoc) . hsq_tvs $ bndrs bname (UserTyVar name) = name bname (KindedTyVar (L _ name) _) = name sugar :: (NamedThing name, DataId name) => HsType name -> HsType name sugar = sugarTuples . sugarLists sugarLists :: forall name. (NamedThing name, DataId name) => HsType name -> HsType name sugarLists = everywhere $ mkT (sugarListsStep :: HsType name -> HsType name) sugarListsStep :: NamedThing name => HsType name -> HsType name sugarListsStep (HsAppTy (L _ (HsTyVar name)) ltyp) | isBuiltInSyntax name' && strName == "[]" = HsListTy ltyp where name' = getName name strName = occNameString . nameOccName $ name' sugarListsStep typ = typ sugarTuples :: HsType name -> HsType name sugarTuples = id