{-# LANGUAGE EmptyDataDecls, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, TypeFamilies #-} module Data.HList.Graph ( Graph(..) , NodeSet , NodeIDSet , Node(..) , LPath(..) , IsEmpty , NodeIDA ) where import Data.HList.Prelude -- NodeSet class NodeSet ns instance NodeSet Nil instance NodeSet ns => NodeSet (Cons n ns) -- NodeIDSet class NoDuplicates ids => NodeIDSet ids instance NodeIDSet Nil instance (OccursNot id ids, NodeIDSet ids) => NodeIDSet (Cons id ids) -- LPath (list of labeled node IDs) class LPath p instance LPath Nil instance LPath p => LPath (Cons (Cons l id) p) -- Node class NodeIDSet (LinksFrom n) => Node n where type NodeID n type LinksFrom n -- NodeIDA data NodeIDA instance ApplyT NodeIDA n where type Apply NodeIDA n = NodeID n -- Graph class ( NodeSet (Nodes g) , NoDuplicates (Map NodeIDA g) ) => Graph g where type Empty g type Nodes g -- IsEmpty type family IsEmpty g