type-structure-0.1.1: Type structure analysis

Safe HaskellNone

TypeStructure

Contents

Description

This library provides facilities to get a representation data of a type, while traversing all the types it refers to down to the primitives. Thus it transitively captures all the types involved, which may even come from different libraries.

The produced data structure is a graph, which has a Hashable instance, so it can be used to perform the matching aswell. E.g., one can produce a "version" hash with it.

To provide support by this library for any type use the TemplateHaskell to derive an instance of the TypeStructure class like this:

 {-# LANGUAGE TemplateHaskell #-}
 
 import qualified TypeStructure
 
 data AnyData = A | B Int | C Char
 
 TypeStructure.derive ''AnyData

Following is a GHCi session, showing, how the library is supposed to be used:

 λ>import TypeStructure 

Construction of the type structure representation graph:

 λ>graph (undefined :: Int)
 ( 
   Type_Con ("GHC.Types","Int"),
   [
     ( 
       ("GHC.Types","Int"),
       Declaration_ADT [] 
         [
           ("I#",[Type_Con ("GHC.Prim","Int#")])
         ] 
     ),
     (
       ("GHC.Prim","Int#"),
       Declaration_Primitive
     )
   ]
 )

Graphs of different types are guaranteed to be different:

 λ>graph (undefined :: Int) /= graph (undefined :: Integer)
 True

Graphs of values of the same type are guaranteed to be the same:

 λ>graph True == graph False
 True    

Acquiring a hash of the typestructure:

 λ>import Data.Hashable
 λ>hash $ graph (undefined :: Int)
 3224108341943761557

Hashes of different types should not be equal:

 λ>(hash $ graph (undefined :: Int)) /= (hash $ graph (undefined :: Integer))
 True

Synopsis

Class

class TypeStructure a whereSource

A type structure graph production.

Supposed to be used like this:

 graph (undefined :: Int)

Methods

graph :: a -> GraphSource

Instances

TypeStructure Bool 
TypeStructure Char 
TypeStructure Double 
TypeStructure Float 
TypeStructure Int 
TypeStructure Int8 
TypeStructure Int16 
TypeStructure Int32 
TypeStructure Int64 
TypeStructure Integer 
TypeStructure Ordering 
TypeStructure Word 
TypeStructure Word8 
TypeStructure Word16 
TypeStructure Word32 
TypeStructure Word64 
TypeStructure () 
TypeStructure E0 
TypeStructure E1 
TypeStructure E2 
TypeStructure E3 
TypeStructure E6 
TypeStructure E9 
TypeStructure E12 
TypeStructure ThreadId 
TypeStructure All 
TypeStructure Any 
TypeStructure TypeRep 
TypeStructure ByteString 
TypeStructure IntSet 
TypeStructure Text 
TypeStructure AbsoluteTime 
TypeStructure LocalTime 
TypeStructure ZonedTime 
TypeStructure TimeOfDay 
TypeStructure TimeZone 
TypeStructure UTCTime 
TypeStructure NominalDiffTime 
TypeStructure Day 
TypeStructure UniversalTime 
TypeStructure DiffTime 
TypeStructure Declaration 
TypeStructure Type 
TypeStructure a => TypeStructure [a] 
TypeStructure a => TypeStructure (Ratio a) 
TypeStructure a => TypeStructure (StableName a) 
TypeStructure a => TypeStructure (Fixed a) 
TypeStructure a => TypeStructure (Dual a) 
TypeStructure a => TypeStructure (Sum a) 
TypeStructure a => TypeStructure (Product a) 
TypeStructure a => TypeStructure (First a) 
TypeStructure a => TypeStructure (Last a) 
TypeStructure a => TypeStructure (Maybe a) 
TypeStructure a => TypeStructure (Tree a) 
TypeStructure a => TypeStructure (Seq a) 
TypeStructure a => TypeStructure (IntMap a) 
TypeStructure a => TypeStructure (Set a) 
TypeStructure a => TypeStructure (Identity a) 
TypeStructure a => TypeStructure (HashSet a) 
TypeStructure a => TypeStructure (Vector a) 
(TypeStructure _0, TypeStructure _1) => TypeStructure (_0 -> _1) 
TypeStructure _0 => TypeStructure (Any (* -> *) _0) 
(TypeStructure a, TypeStructure b) => TypeStructure (Either a b) 
(TypeStructure a, TypeStructure b) => TypeStructure (a, b) 
(TypeStructure i, TypeStructure e) => TypeStructure (UArray i e) 
(TypeStructure i, TypeStructure e) => TypeStructure (Array i e) 
(TypeStructure k, TypeStructure a) => TypeStructure (Map k a) 
(TypeStructure k, TypeStructure v) => TypeStructure (HashMap k v) 
(TypeStructure a, TypeStructure b, TypeStructure c) => TypeStructure (a, b, c) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d) => TypeStructure (a, b, c, d) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e) => TypeStructure (a, b, c, d, e) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f) => TypeStructure (a, b, c, d, e, f) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g) => TypeStructure (a, b, c, d, e, f, g) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h) => TypeStructure (a, b, c, d, e, f, g, h) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i) => TypeStructure (a, b, c, d, e, f, g, h, i) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j) => TypeStructure (a, b, c, d, e, f, g, h, i, j) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s, TypeStructure t) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s, TypeStructure t, TypeStructure u) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s, TypeStructure t, TypeStructure u, TypeStructure v) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s, TypeStructure t, TypeStructure u, TypeStructure v, TypeStructure w) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w) 
(TypeStructure a, TypeStructure b, TypeStructure c, TypeStructure d, TypeStructure e, TypeStructure f, TypeStructure g, TypeStructure h, TypeStructure i, TypeStructure j, TypeStructure k, TypeStructure l, TypeStructure m, TypeStructure n, TypeStructure o, TypeStructure p, TypeStructure q, TypeStructure r, TypeStructure s, TypeStructure t, TypeStructure u, TypeStructure v, TypeStructure w, TypeStructure x) => TypeStructure (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x) 

derive :: Name -> Q [Dec]Source

Automatically derive the instance of TypeStructure using Template Haskell.

Model

type Graph = (Type, Dictionary)Source

A representation of the type structure graph.

Consists of a type signature of the subject type and a dictionary of all the types it refers to internally with primitive types as end-nodes.

type TypeVar = NameSource

A type variable.

type TypeCon = (Namespace, Name)Source

A type constructor.

type Name = TextSource

A name.

type Namespace = TextSource

A namespace (module name).

type Dictionary = [(TypeCon, Declaration)]Source

A dictionary of type declarations indexed by type constructors.

type Constructor = (Name, [Type])Source

A data constructor used in type declaration.