th-typegraph-0.32: Graph of the subtype relation

Safe HaskellNone
LanguageHaskell2010

Language.Haskell.TH.TypeGraph.Expand

Description

The Expanded class helps keep track of which Type values have been fully expanded to a canonical form. This lets us use the Eq and Ord relationships on Type and Pred values when reasoning about instance context. What the expandType function does is use the function from th-desugar to replace occurrences of ConT name with the associated Type if name is a declared type synonym TySynD name _ typ. For convenience, a wrapper type E is provided, along with the Expanded instances E Type and E Pred. Now the expandType and expandPred functions can be used to return values of type E Type and E Pred respectively.

Instances Expanded Type Type and Expanded Pred Pred are provided in Language.Haskell.TH.Context.Unsafe, for when less type safety is required.

Synopsis

Documentation

newtype E a Source

A concrete type used to mark type which have been expanded

Constructors

E 

Fields

_unE :: a
 

Instances

Monad m => MonadStates ExpandMap (StateT TypeInfo m) 
Eq a => Eq (E a) Source 
Data a => Data (E a) Source 
Ord a => Ord (E a) Source 
Show a => Show (E a) Source 
Ppr a => Ppr (E a) Source 
Lift (E Type) Source 

unE :: forall a a. Iso (E a) (E a) a a Source

type ExpandMap = Map Type (E Type) Source

The state type used to memoize expansions.

expandType :: (DsMonad m, MonadStates ExpandMap m) => Type -> m (E Type) Source

Apply the th-desugar expand function to a Type and mark it as expanded.

expandPred :: (DsMonad m, MonadStates ExpandMap m) => Type -> m (E Type) Source

Apply the th-desugar expand function to a Pred and mark it as expanded. Note that the definition of Pred changed in template-haskell-2.10.0.0.

expandClassP :: forall m. (DsMonad m, MonadStates ExpandMap m) => Name -> [Type] -> m (E Type) Source

Expand a list of Type and build an expanded ClassP Pred.